find . -exec somecommand {} \;
有没有办法在不实际运行命令的情况下查看替换后 a 的结果是什么?像试运行(或测试运行或打印)?
例如,假设我有以下文件结构:
/a/1.txt
/a/2.txt
/a/b/3.txt
有没有一种方法可以find . type f -exec rm {} \;
从a
目录内进行测试,以便将输出打印到 stdout 但不执行,例如:
rm 1.txt
rm 2.txt
rm b/3.txt
更新
注意:rm
这只是一个示例命令,我对一般情况感兴趣
答案1
你可以运行echo rm
而不是rm
find . type f -exec echo rm {} \;
此外,还find
可以-delete
选择删除找到的文件
答案2
具体来说rm
,您不需要-exec
:只需运行find . -type f
列表,然后添加-delete
即可删除上一个命令列出的文件(显然禁止同时创建/删除任何匹配的文件)。
另外,对于像rm
这样采用任意数量的参数的命令,您需要替换\;
为+
以运行尽可能少的命令。
答案3
这有点拗口,但与使用 的方法不同echo
,下面的输出代码您可以在 shell 中运行,无需任何更改即可获得正确的结果,即使您的文件名包含引号、空格、shell 元字符等。
printcmd() { printf '%q ' "$@"; printf '\n'; }
find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
请注意,我们在参数前面添加的字符串-exec
是精确的bash -c "$(declare -f printcmd); "'printcmd "$@"' _
——$(declare -f printcmd)
扩展为函数的代码;之后,我们实际上打电话带有参数和向前的函数$1
,并_
作为 的占位符$0
。
如果您希望该 shell 的输出转义,您可以用zsh
or代替 bash。ksh