我正在尝试将一些文件从find命令传递到交互式删除命令,这样我就可以仔细检查我要删除的文件,但是我遇到了一些麻烦.
find -name '#*#' -print0 | xargs -0 rm -i
Run Code Online (Sandbox Code Playgroud)
我以为上面会有用,但我只是得到一串 "rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."
有人可以向我解释究竟发生了什么,以及我能做些什么才能得到我想要的结果?谢谢.
unx*_*nut 12
您可以使用exec
选项来执行此操作find
.使用该命令
find . -name '#*#' -exec rm -i {} \;
Run Code Online (Sandbox Code Playgroud)
xargs
将无法工作(除非您使用-o
或等选项-p
),因为它用于stdin
构建命令.由于stdin
已经在使用,您无法输入查询响应rm
.
有人可以向我解释到底发生了什么,
正如xargs的手册页所说(在-a
选项下):"如果使用此选项,则stdin 在运行命令时保持不变.否则,stdin将从/ dev/null重定向."
由于您没有使用该-a
选项,rm -i
因此xargs
正在运行的每个命令都会从/ dev/null获取其stdin(即没有可用的输入).当rm
询问是否删除特定文件时,答案实际上是"否",因为/ dev/null没有给出答复.rm
在其输入上接收EOF,因此它不会删除该文件,并继续下一个文件.
我能做些什么才能得到我想要的结果呢?
除了使用find -exec
unxnut解释之外,另一种方法是使用-o
(或--open-tty
)选项xargs
:
find -name '#*#' -print0 | xargs -0 -o rm -i
Run Code Online (Sandbox Code Playgroud)
这可能是理想的方式,因为它允许rm -i
按照设计处理交互式确认.
另一种方法是使用-p
(或--interactive
)选项xargs
:
find -name '#*#' -print0 | xargs -0 -p rm
Run Code Online (Sandbox Code Playgroud)
使用此方法,xargs
处理交互式确认而不是rm
执行此操作.您可能还想使用-n 1
,以便每个提示只询问一个文件:
find -name '#*#' -print0 | xargs -0 -p -n 1 rm
Run Code Online (Sandbox Code Playgroud)
使用xargs
over 的优点find -exec
是可以将它与任何生成文件路径参数的命令一起使用,而不仅仅是使用find
.
归档时间: |
|
查看次数: |
5085 次 |
最近记录: |