我正在寻找一种解决方案来响应“rm:删除写保护的常规文件 [x]?”
我正在考虑在 bashrc 中多次发出一个字符,然后多次回车。我们该怎么做呢?
答案1
根据更新的问题进行编辑:
为了避免被询问是否删除文件,请添加-f
(“force”)选项:
rm -f /path/to/file
您应该注意这有一个副作用:如果任何给定路径不存在,它将不是报告这个,它将成功返回:
$ rm -f /nonexistent/path
$ echo $?
0
原答案:
这是一个简单的解决方案:
yes "$string" | head -n $number | tr $'\n' $'\r'
yes
无限重复您给出的任何字符串,并以换行符分隔。多次head
后停止$number
,并将tr
换行符转换为回车符。由于回车,您可能看不到任何输出,但将其传递给此命令(在 中bash
)应该可以说明这一点:
printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"
没有的用户bash
可以将结果通过管道传输到od
,hexdump
或xxd
查看返回的实际字符。
答案2
rm
被硬编码来询问交互地关于写保护的文件。 “交互式”意味着它将打印一个问题,然后等待用户输入。
有两种方法可以防止rm
询问:
rm -rf somedir
^
和
rm -r --interactive=never somedir
^^^^^^^^^^^^^^^^^^^
-r
(当删除文件而不是目录时,两者也可以工作)
解释:
-f
使rm
“忽略不存在的文件和参数,从不提示”。
--interactive=never
言出必行:永远不要互动。换句话说:从不提示。
-f
和之间的区别--interactive=never
是这部分:“忽略不存在的文件和参数”。
比较:
$ rm -rf nonexistingname
$ echo $?
0
和
$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1
rm
当您编写不想交互但仍想处理错误的脚本时,差异主要很有趣。
摘要:在命令行上使用rm -rf
.在脚本中使用rm -r --interactive=never
.
奖励:如果编写脚本和要删除的文件名来自外部,您应该使用卫生措施来防止时髦的文件名和恶意输入。
rm -r --interactive=never -- "./$filename"
重要部分:双破折号 ( --
) 标记选项结尾,以防止以破折号开头的文件名;引号以防止文件名中出现空格;和前导点斜杠 ( ./
) 可双重防止以破折号开头的文件名,并强制所有文件与工作目录相关。
请参阅此处了解更多信息:https://www.cyberciti.biz/faq/unix-linux-remove-strange-names-files/
有关所陈述问题的答案(“如何避免在删除受保护文件时多次发出“y””),请参阅https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line/338860#338860
答案3
我不时遇到的另一个问题是rm
别名为rm -i
,在 /etc/bashrc 中类似这样:
alias rm='rm -i'
在这种情况下,您可以unalias rm
或者使用我几年前发现的这个技巧,在已使用别名的命令前面放置一个反斜杠,以忽略一次别名,例如:
\rm somefile
您可以通过以下文章了解有关别名的更多信息尼克斯克拉夫特。
答案4
我也遇到了同样的问题。上面的答案仅适用于一个文件,但如果您想忽略很多是的。
您可以使用
sudo rm -r /path/to/directory
删除所有写保护的常规文件