如何在xargs -0之后执行多个命令?

Ric*_*hen 24 bash find xargs

find . -name "filename including space" -print0 | xargs -0 ls -aldF > log.txt
find . -name "filename including space" -print0 | xargs -0 rm -rdf
Run Code Online (Sandbox Code Playgroud)

是否可以将这两个命令合并为一个,这样只能完成1个查找而不是2个?

我知道xargs -I可能有办法做到这一点,这可能会导致文件名(包括空格)时出错.任何指导都非常感谢.

gle*_*man 48

find . -name "filename including space" -print0 | 
  xargs -0 -I '{}' sh -c 'ls -aldF {} >> log.txt; rm -rdf {}'
Run Code Online (Sandbox Code Playgroud)


Jon*_*n M 16

如果您只是想避免find多次执行,您可以teefindfind输出保存到文件之后立即执行,然后执行以下行:

find . -name "filename including space" -print0 | tee my_teed_file | xargs -0 ls -aldF > log.txt
cat my_teed_file | xargs -0 rm -rdf 
Run Code Online (Sandbox Code Playgroud)

另一种完成同样事情的方法(如果确实是你想要完成的事情),就是将find变量的输出存储起来(假设它不是TB的数据):

founddata=`find . -name "filename including space" -print0`
echo "$founddata" | xargs -0 ls -aldF > log.txt
echo "$founddata" | xargs -0 rm -rdf
Run Code Online (Sandbox Code Playgroud)


Ric*_*hen 5

我相信所有这些答案现在已经找到了解决这个问题的正确方法.我尝试了Jonathan的两个解决方案和Glenn的方式,所有这些解决方案在我的Mac OS X上运行良好.mouviciel的方法在我的操作系统上不起作用可能是由于一些配置原因.而且我认为它类似于乔纳森的第二种方法(我可能错了).

正如对格伦方法的评论所述,需要进行一些调整.所以这是我试过的命令,它完美地运行了FYI:

find . -name "filename including space" -print0 | 
xargs -0 -I '{}' sh -c 'ls -aldF {} | tee -a log.txt ; rm -rdf {}'
Run Code Online (Sandbox Code Playgroud)

或者根据格伦的建议更好:

find . -name "filename including space" -print0 | 
xargs -0 -I '{}' sh -c 'ls -aldF {} >> log.txt ; rm -rdf {}'
Run Code Online (Sandbox Code Playgroud)