找到-exec 干运行吗?

找到-exec 干运行吗?

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 的输出转义,您可以用zshor代替 bash。ksh

相关内容