【问题标题】:Delete A Specific File From Directories Based On FIND Results根据 FIND 结果从目录中删除特定文件
【发布时间】:2021-05-29 05:03:02
【问题描述】:

我有以下 find 命令搜索所有子目录并列出那些包含 *.RAR AND *.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。希望这有助于澄清。

感谢您的帮助。

问候。

【问题讨论】:

  • 请提供minimal reproducible example,以便我们尝试一些事情。从该测试结构中添加一个测试目录和文件结构以及您在问题中输入的命令的输出。
  • 好的。对不起。新来的,我认为我发布的内容已经足够了,但它就在这里。
  • 所以我创建了一个“_TestDir”,下面有以下文件夹和文件:
    user@server ~/files/_TestDir $ ls -all total 0 drwxr-xr-x 7 fatbob fatbob 105 年 2 月 27 日 19:30。 drwxrwx--- 7 fatbob fatbob 105 Feb 27 19:29 .. drwxr-xr-x 2 fatbob fatbob 50 Feb 27 19:31 Folder01 drwxr-xr-x 2 fatbob fatbob 50 Feb 27 19:32 Folder02 drwxr-xr-x 2 fatbob fatbob 50 2 月 27 日 19:32 Folder03 drwxr-xr-x 2 fatbob fatbob 50 2 月 27 日 19:33 Folder04 drwxr-xr-x 2 fatbob fatbob 50 2 月 27 日 19:34 Folder05
  • 每个文件夹有 2 个文件,除了 Folder03,它只有 FIleE.mkv user@server ~/files/_TestDir $ ls Folder01 -all total 0 drwxr-xr-x 2 fatbob fatbob 50 Feb 27 19 :31 。 drwxr-xr-x 7 fatbob fatbob 105 2 月 27 日 19:30 .. -rw-r--r-- 1 fatbob fatbob 0 2 月 27 日 19:30 FileA.mkv -rw-r--r-- 1 fatbob fatbob 0 2月27日 19:31 FileB.rar Folder02: FileC.mkv / FileD.rar Folder03: FileE.mkv Folder04: FileG.mkv / FileH.rar Folder05: FileI.mkv / FileJ.rar
  • 当我在原始帖子中运行命令时,我得到这个:user@server ~/files/_TestDir $ find -type d -exec sh -c '[ -f "$0"/*. rar ] && [ -f "$0"/*.mkv ]' '{}' \; -打印 |排序 ./Folder01 ./Folder02 ./Folder04 ./Folder05

标签: shell find command delete-file


【解决方案1】:

您想使用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"
    

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

【讨论】:

  • 谢谢,这在 _TestDir 中运行良好,但在我需要运行的实际目录中却没有,我知道为什么。 “生产”中的文件名实际上并不称为 File?.mkv,所以我也需要使文件名动态化,但我意识到文件名将始终与文件夹名相同。所以我只是替换了“文件?”使用 % ,这一切都像一个魅力。非常感谢!
  • 实际上,在某些情况下,文件名和目录名之间的大小写似乎发生了变化。所以如果目录是“FolderName”,文件名是“foldername.mkv”,这不起作用。有什么方法可以以某种方式解决这个问题?
  • 这可以编写脚本,但我不会尝试通过单行来执行。这将是一条疯狂的路线,更容易调试和编写复杂操作的脚本。在variableA中存放目录名,在variableB中存放文件名,两者都小写,如果匹配则删除文件。对于小写操作,可以使用lowerA=$(echo $variableA | tr '[:upper:]' '[:lower:]')
  • 谢谢。不幸的是,1)我不是一个编码员,也不知道如何编写这个脚本和 2)即使我想出来,这是一个 SEEDBOX,并且不确定脚本是否必须具有提升的权限才能能够运行这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多