shell - 根据 FIND 结果从目录中删除特定文件
问题描述
我有以下 find 命令搜索所有子目录并列出那些包含 *.RAR和*.MKV 文件的文件夹。
find -type d -exec sh -c '[ -f "$0"/*.rar ] && [ -f "$0"/*.mkv ]' '{}' \; -print | sort
我现在要做的是从这些目录中删除 *.MKV 文件。
例如,上述命令查找 FILEA.RAR 和 FILEB.MKV 并将目录列为 DIRECTORY_CHARLIE。我希望能够拥有上述代码,同时删除 FILEB.MKV 文件,以及从具有两种文件类型的每个目录中删除找到的 MKV 文件。
首先,我使用以下子文件夹创建了“_TestDir”:
@useroneserver ~/files/_TestDir $ ls -all
drwxr-xr-x 2 userone userone 50 Feb 27 19:31 Folder01
drwxr-xr-x 2 userone userone 50 Feb 27 19:32 Folder02
drwxr-xr-x 2 userone userone 50 Feb 27 19:32 Folder03
drwxr-xr-x 2 userone userone 50 Feb 27 19:33 Folder04
drwxr-xr-x 2 userone userone 50 Feb 27 19:34 Folder05
每个文件夹有 2 个文件,除了 Folder03,它只有一个文件。
userone@remoteserver ~/files/_TestDir $ ls Folder01 -all
drwxr-xr-x 2 userone userone 50 Mar 1 20:03 .
drwxr-xr-x 7 userone userone 105 Feb 27 19:30 ..
-rw-r--r-- 1 userone userone 0 Feb 27 19:31 File1.rar
-rw-r--r-- 1 userone userone 0 Feb 27 19:30 FileA.mkv
userone@remoteserver ~/files/_TestDir $ ls Folder02 -all
drwxr-xr-x 2 userone userone 50 Mar 1 20:04 .
drwxr-xr-x 7 userone userone 105 Feb 27 19:30 ..
-rw-r--r-- 1 userone userone 0 Feb 27 19:32 File2.rar
-rw-r--r-- 1 userone userone 0 Feb 27 19:31 FileB.mkv
userone@remoteserver ~/files/_TestDir $ ls Folder03 -all
drwxr-xr-x 2 userone userone 30 Mar 1 20:04 .
drwxr-xr-x 7 userone userone 105 Feb 27 19:30 ..
-rw-r--r-- 1 userone userone 0 Feb 27 19:32 FileC.mkv
userone@remoteserver ~/files/_TestDir $ ls Folder04 -all
drwxr-xr-x 2 userone userone 50 Mar 1 20:04 .
drwxr-xr-x 7 userone userone 105 Feb 27 19:30 ..
-rw-r--r-- 1 userone userone 0 Feb 27 19:33 File4.rar
-rw-r--r-- 1 userone userone 0 Feb 27 19:33 FileD.mkv
userone@remoteserver ~/files/_TestDir $ ls Folder05 -all
drwxr-xr-x 2 userone userone 50 Mar 1 20:05 .
drwxr-xr-x 7 userone userone 105 Feb 27 19:30 ..
-rw-r--r-- 1 userone userone 0 Feb 27 19:34 File5.rar
-rw-r--r-- 1 userone userone 0 Feb 27 19:33 FileE.mkv
当我在原始帖子中运行命令时,我得到了这个:
userone@remoteserver ~/files/_TestDir $ find -type d -exec sh -c '[ -f "$0"/*.rar ] && [ -f "$0"/*.mkv ]' '{}' \; -print | sort
./Folder01
./Folder02
./Folder04
./Folder05
这就是我期望看到的结果,因为文件夹 1、2、4 和 5 有一个我正在寻找的每个扩展名的文件(*.rar 和 *.mkv),而文件夹 3 只有一个*.mkv 文件。
我没有尝试添加任何删除功能,因为我不知道从哪里开始。
我想要发生的是能够删除/删除以下文件:
FileA.mkv from Folder01
FileB.mkv from Folder02
FileD.mkv from Folder04
FileE.mkv from Folder05
Folder03 中没有任何内容被删除,因为它没有 .RAR 和 .MKV 文件,它只有 .MKV。希望这有助于澄清。
谢谢您的帮助。
问候。
解决方案
你想用xargs
运行rm
来删除文件。-I
并使用 的选项定义替换字符串xargs
。
使用您的目录结构,您可以执行以下操作:
find -type d -exec sh -c '[ -f "$0"/*.rar ] && [ -f "$0"/*.mkv ]' '{}' \; -print | sort | xargs -I % sh -c "rm -f %/File?.mkv"
我接受了您的确切find
命令,并添加了以下内容:
| xargs -I % sh -c "rm -f %/File?.mkv"
解释
运行时
find
会输出./Folder01 ./Folder02 ./Folder04 ./Folder05
由于
xargs
与-I %
选项一起使用,它将运行命令,并替换%
为每个目录(就像循环一样,一个接一个)。您可以使用除 之外的其他字符%
,但请避免使用通配符。xargs
将运行的命令是sh -c "rm -f %/File?.mkv"
因此,它将连续执行以下命令:
sh -c "rm -f Folder01/File?.mkv" sh -c "rm -f Folder02/File?.mkv" sh -c "rm -f Folder04/File?.mkv" sh -c "rm -f Folder05/File?.mkv"
显然,您可以根据需要进行调整。
推荐阅读
- json - 如何创建 JSON 文件结构,然后使用 bash 输出通过 jq 填充
- reactjs - 试图改变这个的背景颜色
datepicker material-UI 组件(提供 CodeSandbox) - docker - 如何在 Windows 10 中使用 Docker 中的 thenets/parsoid 将本地文本文件转换为 html?
- javascript - 验证+提交后反应输入值从定义变为未定义
- java - 更改代理和脚本库的默认 Java 版本
- c - 释放单链表的内存时出现无效的 free() 错误
- vim - Vim,映射非标准键(前进/后退/放大/缩小/收藏夹)
- windows - 用于从子文件夹和子文件夹中的文件中删除破折号的 Windows 批处理脚本
- regex - Fluent-Bit 是如何提取日志时间的,并且仍然保留原始日志时间的输出?
- python - 在 Tk.Canvas 中制作新的 Pillow 图像时,为什么数组有效但变量无效?