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


33

我使用以下行找到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,但将其固定起来,我该怎么做(最好是简单地)?

Answers:


36

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

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

4
可爱的,我更改'%p''%p\n',使名称在其自己的行上的verify输出之前。
Arronical

17
@Arronical如果这是您想要的格式,则可以用-printf '%p\n'更简单的格式替换(格式化的)-print
steeldriver

4
find -name <a_name> -print -exec command {} \;
toliveira

14

如果您不想递归,那么使用毫无意义find。直接在shell中进行操作要简单得多:

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

for d in */会发现所有的目录(在*/确保只有目录和找不到文件); 在echo "$d"将打印目录的名称; 在 svnadmin verify "$d"将检查目录。

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


1
这看起来确实是实现我的目标的一种更好的方法,但是我不得不给Fiximan答案,因为我的标题和问题参考find太多了。不过,感谢您提高我的知识!
Arronical

这需要使用glob。Globbing绝对有用且功能强大,但是以我个人的经验,语法更难以设置,并且常常最终需要使用bash dotglobglobstarbash 等其他东西,这会创建更长,更复杂的脚本。我倾向于将glob保存在大型复杂任务上,而find只需将一堆过滤器和命令串成一条直线,则的语法就更容易随时随地投入使用。
user5359531 '16

@ user5359531这里不需要globstar或dotglob(除非您知道您有隐藏文件并且实际上想要它们)。显然这是一个见解,但是您是我见过的第一个认为find较简单的钝格式的人。我总是更喜欢glob,find因为我不仅发现它们更简单,而且在处理传递给其他程序的任意文件名时也更安全。
terdon

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

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


{}至少在svnadmin verify {}
kos

感谢您的快速回复。因此,在此命令中是否-exec生成一个子外壳程序(在其中运行这两个命令);作为行尾?
Arronical 2015年

5

尝试这个:

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

如果您只想要目录(感谢@kos注意):

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

不错,但是这也可以处理文件:for f in */仅处理目录
kos 2015年

这只会在脚本中起作用吗?还是可以在命令行上发布它?
Arronical

1
@Arronical也可以作为命令行使用
Maythux

2
  • 使用. -maxdepth 1代替./*,您只需要文件夹结构中的第一级
  • 使用-type d,您只需要文件夹
  • 使用! -name ".",您不需要.
  • 使用-exec启动一个shell
  • 用于sh -c在外壳内启动命令

你的命令

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

或更短

  • 使用-prune如果该文件是目录,不要陷入它

你的命令

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

-prune看起来很有趣。我曾经./* -maxdepth 0避免.从find命令返回。它不会导致任何严重错误,但我更希望在输出中不包含该错误。
Arronical

1

find有用于打印的选项标志,其他答案中已经提到。如果从问题的角度看待针对同一当前处理的文件执行多个命令的观点,则find允许使用多个-exec语句。这意味着我们可以选择使用:

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

再次,注意,这种方法适用于不只是与打印echoprintf或其他公用设施,还包括其他的命令。


0

find输出通过管道传递到read循环可能会很有用:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

它使您可以执行复杂的复合命令序列,其文件名由返回find,如下面的ls示例所示:

find . | while read f; do echo ${f} | figlet -k; done

-1

这将以递归方式仅打印文件的名称和内容。

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.