在多个目录中运行命令

时间:2013-05-08 22:32:31

标签: bash find xargs

我在我的许多子目录中运行此命令:

ls *.rst -C1 -t | awk 'NR>1' | xargs rm

基本上,这会列出以.rst结尾的所有文件,然后根据它们创建的时间对它们进行排序,我只想要最近创建的文件。然后我删除了剩余的* .rst文件。

我有200个目录需要执行此命令。我尝试使用find命令将目录的位置传递给此命令,但我没有成功。所有这些目录都包含inputs.in文件。我试过了:

find . -name inputs.in | xargs ls *.rst -C1 -t | awk 'NR>1' | xargs rm

但我相信,因为ls * .rst位的输入是包含文件名的完整路径,所以它一直没有工作。

我确信这是快速修复,但我们非常感谢您的帮助和评论。我想从父目录运行此命令。谢谢!

2 个答案:

答案 0 :(得分:1)

有些丑陋的方式:

find . -name inputs.in | xargs dirname |                     \
     xargs -I{} -n 1 find {} -name '*.rst' | xargs ls -C1 -t |    \
     awk 'NR>1' | xargs rm

带有通配符的ls会失败,因为在执行find之前会发生globbing。

答案 1 :(得分:0)

如果你安装了GNU Parallel:

find . -name inputs.in | parallel "cd {//} && ls *.rst -C1 -t | awk 'NR>1' | xargs rm"

如果没有为您的系统打包,则应在10秒内安装:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

要了解更多信息:观看介绍视频,以便快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程(man parallel_tutorial)。你命令行 会爱你的。