根据查找结果从目录中删除特定文件
Delete A Specific File From Directories Based On FIND Results
我有以下查找命令搜索所有子目录并列出包含 *.RAR AND *.MKV 文件的文件夹。
find -type d -exec sh -c '[ -f "[=10=]"/*.rar ] && [ -f "[=10=]"/*.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
当我 运行 原来 post 中的命令时,我得到这个:
userone@remoteserver ~/files/_TestDir $ find -type d -exec sh -c '[ -f "[=13=]"/*.rar ] && [ -f "[=13=]"/*.mkv ]' '{}' \; -print | sort
./Folder01
./Folder02
./Folder04
./Folder05
这是我希望看到的结果,因为文件夹 1、2、4 和 5 都有一个包含我要查找的每个扩展名的文件(*.rar 和 *.mkv),其中文件夹3只有一个*.mkv文件
我没有尝试添加任何删除功能,因为我不知道从哪里开始。
我希望发生的是能够remove/delete以下
文件:
FileA.mkv from Folder01
FileB.mkv from Folder02
FileD.mkv from Folder04
FileE.mkv from Folder05
没有从 Folder03 中删除任何内容,因为它没有 .RAR 和 .MKV 文件,它只有 .MKV。希望这有助于澄清。
感谢您的协助。
此致。
您想使用 xargs
到 运行 rm
这将删除文件。
并使用 xargs
的 -I
选项定义替换字符串。
使用您的目录结构,您可以:
find -type d -exec sh -c '[ -f "[=10=]"/*.rar ] && [ -f "[=10=]"/*.mkv ]' '{}' \; -print | sort | xargs -I % sh -c "rm -f %/File?.mkv"
我接受了你的 find
命令,并添加了这个:
| xargs -I % sh -c "rm -f %/File?.mkv"
说明
当find
运行s时,会输出
./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"
当然可以根据需要调整。
我有以下查找命令搜索所有子目录并列出包含 *.RAR AND *.MKV 文件的文件夹。
find -type d -exec sh -c '[ -f "[=10=]"/*.rar ] && [ -f "[=10=]"/*.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
当我 运行 原来 post 中的命令时,我得到这个:
userone@remoteserver ~/files/_TestDir $ find -type d -exec sh -c '[ -f "[=13=]"/*.rar ] && [ -f "[=13=]"/*.mkv ]' '{}' \; -print | sort
./Folder01
./Folder02
./Folder04
./Folder05
这是我希望看到的结果,因为文件夹 1、2、4 和 5 都有一个包含我要查找的每个扩展名的文件(*.rar 和 *.mkv),其中文件夹3只有一个*.mkv文件
我没有尝试添加任何删除功能,因为我不知道从哪里开始。
我希望发生的是能够remove/delete以下 文件:
FileA.mkv from Folder01
FileB.mkv from Folder02
FileD.mkv from Folder04
FileE.mkv from Folder05
没有从 Folder03 中删除任何内容,因为它没有 .RAR 和 .MKV 文件,它只有 .MKV。希望这有助于澄清。
感谢您的协助。
此致。
您想使用 xargs
到 运行 rm
这将删除文件。
并使用 xargs
的 -I
选项定义替换字符串。
使用您的目录结构,您可以:
find -type d -exec sh -c '[ -f "[=10=]"/*.rar ] && [ -f "[=10=]"/*.mkv ]' '{}' \; -print | sort | xargs -I % sh -c "rm -f %/File?.mkv"
我接受了你的 find
命令,并添加了这个:
| xargs -I % sh -c "rm -f %/File?.mkv"
说明
当
find
运行s时,会输出./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"
当然可以根据需要调整。