【问题标题】:I need my script to edit and force write read-only files我需要我的脚本来编辑和强制写入只读文件
【发布时间】:2016-07-12 02:20:03
【问题描述】:

我有一个脚本可以更改文件中的行。工作正常,但从那时起,文件将是只读的。我已经尝试将 wq 更改为 wq! (就像我在 VI 中所做的那样)但这似乎没有效果。我也试过“zz”,它也没有做任何事情。

感谢您的帮助;谢谢。

debug=false

## *****Put file name in quotes******
declare -a arr=("UF19905217" "UG19905218" )

##Put date in DDMMYYYY format for the date the message was original processed.
DATE="25082015"

## now loop through the above array
for i in "${arr[@]}"
do
    #if "$debug; then
        echo "Fix file named: Inbound_$i.msg"
        MSG="Inbound_$i.msg"
    #fi

    if [ ! -d "$MSG" ]; then
    # Enter what you would like changed here.  You can copy and paste this command for multiple changes

        #DATATYPE
        printf "%s\n" ',s/<DataType>EDI<\/DataType>/<DataType>830<\/DataType>/g' wq | ed -s  /data1/Inbound/$DATE/$MSG        

        echo "Complete"
    else
            echo "Message not found or errored!"
    fi

done

【问题讨论】:

  • 使用chmod在需要编辑之前(和之后)更改文件权限?
  • 您没有使用sed的任何特殊原因?
  • 您会一再感谢自己改用机器可读的可排序日期格式 YYYYMMDD。
  • @tripleee 我不使用 sed 的唯一原因是因为我不知道如何......这看起来是我的最佳选择吗?
  • @FrankCapone 使用另一个编辑器不会改变任何东西,如果我没记错的话,它是底层操作系统和/或文件系统拒绝你写访问权限。

标签: bash vi readonly


【解决方案1】:

如果您对包含该文件的目录具有写入权限,则可以在重写之前将其删除。如果您可以访问 GNU sed,这就是 sed -i 的作用。

我不熟悉ed,但我认为下面的sed 命令与您的命令等效:

sed -i 's/<DataType>EDI<\/DataType>/<DataType>830<\/DataType>/g' /data1/Inbound/$DATE/$MSG 

另外,如果您不是文件的所有者,则该目录不得设置粘性位,否则您将无法删除该文件。

【讨论】:

  • 嗨,亚伦。我可以,但问题是所有文件现在都是只读的。我需要的是一种能够强制写入的解决方案,即使它们是只读的。不过我很欣赏这个建议。
  • 你应该修正你的标题(其中提到强制退出,而不是强制写入),并且可能在你的问题中更具描述性。我认为您可以通过读取、删除和重写文件来绕过只读约束,如果我验证此解决方案,我将更新我的答案。
  • 是的,它可以工作,并且通过sed -i 一步完成。
【解决方案2】:

将此添加到您的 .vimrc:

" Allow saving of files as sudo when I forgot to start vim using   sudo.
cmap w!! w !sudo tee > /dev/null %

然后使用 ":w!!"然后是 ":q" 而不是 ":wq"

有关命令的解释,请参阅this question

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2020-11-17
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2020-03-16
    相关资源
    最近更新 更多