2

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

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 位的输入是包含文件名的完整路径,因此它一直没有工作。

我相信这是快速修复,但您的帮助和评论将不胜感激。我想从父目录运行这个命令。谢谢!

4

2 回答 2

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 执行之前就发生了通配。

于 2013-05-09T00:22:10.833 回答
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)。你的命令行会爱你。

于 2014-08-12T10:23:40.383 回答