使用linux命令行,删除其他扩展的所有子目录中的匹配文件的最简单方法是什么?

使用linux命令行,删除其他扩展的所有子目录中的匹配文件的最简单方法是什么?

我一直在浏览并试图找到答案 - 以最短的字符数完成此操作可以获得奖励积分。

所以我有 file1.ex1 file2.ex1 file1.ex2 但没有 file2.ex2

我想删除所有 ex1 文件,但前提是 ex2 版本首先存在。

所以我认为这意味着我需要获取以我想要保留的扩展名结尾的所有文件的目录列表,通过管道传输并搜索哪些文件与文件名的第一部分匹配,然后将其传输到删除命令中。

我想使用标准的 linux fu,因为我在 unraid 上执行此操作。

我知道这对你们大多数人来说都很容易,这就是为什么我添加了以最少的字符数来完成挑战!哦,这应该适用于仅与该子目录中的内容匹配的所有子目录。

谢谢!

马沙勒克

答案1

find . -name "*.ex1" -type f -exec sh -c '[ -f "${1%1}2" ] && echo rm "$1"' sh {} \;

这会在当前目录中递归查找所有带有后缀的常规文件.ex1,并为找到的每个文件 ( ) 执行单引号内的 shell 脚本$1。它只打印rm它将执行的命令。

  • [ -f "${1%1}2" ] &&测试参数是否$1存在并2作为最后一个字符。 ${1%1}删除最后一个1,我们将其替换为2。测试[ -f ... ] &&文件是否存在,如果条件为真则执行以下命令。

您可以删除echo并再次运行该命令以真正删除文件。

如果只想删除当前目录中的文件而不删除其子目录中的文件:

for i in *.ex1; do [ -f "${i%1}2" ] && echo rm "$i"; done

同样,您必须删除才能echo执行rm

相关内容