当前位置: 首页>>技术教程>>正文


使用 -exec 时如何在 find 命令中输出文件名?

, , ,

问题描述

我使用以下行查找 PWD 的所有子目录并在每个目录上运行 svnadmin verify (我已经知道它们是 Subversion 存储库)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

除了输出如下所示之外,效果很好:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

我真的希望 find 在执行 svnadmin verify 命令之前打印文件名,以使日志记录更容易。

我试图在其中挤一点 ls 但把它固定住了,我应该怎么做(最好是简单的)?

最佳思路

只需在之前添加一个 -printf 选项

find -printf '%p' -exec command \;

次佳思路

如果您不想递归,则在这种情况下使用 find 是没有意义的。直接在 shell 中执行要简单得多:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */将查找所有目录(*/确保只查找目录,不查找文件); echo "$d" 将打印目录的名称; \n svnadmin verify "$d" 将检查目录。

这可以直接从命令行运行,也可以从脚本中运行,无需更改格式。

第三种思路

find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

如果只是目录,我添加了 -type d

第四种思路

尝试这个:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

如果你只想要目录(感谢@kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

第五种思路

  • 使用 . -maxdepth 1 而不是 ./* ,您只需要文件夹结构中的第一层

  • 使用 -type d ,您只需要文件夹

  • 使用 ! -name "." ,不需要 .

  • 使用 -exec 启动 shell

  • 使用 sh -c 在 shell 内启动命令

你的命令

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

或更短

  • 如果文件是目录,则使用 -prune,请勿深入其中

你的命令

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13841.html,未经允许,请勿转载。