shell xargs具有多个命令的管道

irtuqstp  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(134)

我试图在一个目录中查找所有超过30天的.pkl类型的文件,获取找到的文件的父目录并删除它们。我的解决方案如下所示:

find path_to_dir/.cache -type f -name "*.pkl" -mtime +30 |
  xargs dirname | xargs rm -r

有没有办法避免双xargs?另外,我的另一个任务是删除所有日志文件,但不删除父目录。

find path_to_dir -type f -name "*.log" -mtime +30 -delete

我可以在没有代码复制的情况下在一行中完成以上操作吗?

qhhrdooz

qhhrdooz1#

如果你使用GNU find,你可以在-printf命令中使用%h标记:

find path_to_dir/.cache -type f -name '*.pkl' -mtime +30 -printf '%h\0' |
  xargs -0 rm -r

要组合这两个操作,可以使用以下方法:

find path_to_dir/ -mtime +30 -type f \( -name '*.pkl' -printf '%h\0' -o -name '*.log' -print0 \) |
  xargs -0 rm -r

...但这是假设您可以对两个运算使用相同的起始前缀(在示例中,您在第一种情况下使用path_to_dir/.cache,在第二种情况下使用path_to_dir)。

相关问题