根据FIND结果从目录中删除指定文件



我有以下find命令,它搜索所有子目录并列出包含*.RAR的文件夹一个*。MKV文件。

find -type d -exec sh -c '[ -f "$0"/*.rar ] && [ -f "$0"/*.mkv ]' '{}' ; -print | sort

我现在要做的是删除*。

例如,上面的命令查找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,这将删除文件。并使用xargs-I选项定义替换字符串。

使用您的目录结构,您可以:

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"
    

显然,您可以根据需要进行调整。

最新更新