删除以文件命名的目录

删除以文件命名的目录

我一直在寻找一个代码片段放在.sh 中,用于删除以文件命名的目录。

我的意思是我想移动到指定目录,然后在其中搜索“.XXX”类型的文件列表,然后删除任何具有相同名称的子目录(包含内容)。

我想要做的伪代码:

find names all files of type .XXX within a directory
find and remove all subdirectories with names that equal the file names found

最好的办法是什么?我一直在研究 find 函数,我将在使用该函数之前使用该函数来解压档案:

`find . -name "*.rar" -exec unrar x '{}' \;`

答案1

这里不太清楚的是,你不能拥有同名的文件和目录。另外,既然你提到解压 rar 文件,人们可能会认为你想删除以 rar 文件命名的目录。这很奇怪,因为为什么在解压后要删除它?

根据我对这个问题的糟糕理解(如果你澄清或者更好的是提供一个例子,可能会有所改善),这可能会起作用:

for i in *rar; do
    (cd uncompressed && rm -rf $i)
done

所以如果你有类似的东西

./file1.rar
./file2.rar
./file3.rar
./uncompressed/file1.rar/...
./uncompressed/file2.rar/...
./uncompressed/file3.rar/...

我发布的小脚本应该删除未压缩下的所有文件*.rar/子目录。

答案2

如果你想查找所有目录 d,其中 d 包含文件 d.xyz。那么这将为你找到目录。

find . -type d -print0 |
xargs -0 --replace={} --max-args=1 bash -c 'find {} -maxdepth 1 -name $(basename {}).xyz -print0' |
xargs -0 --replace={}  bash -c 'echo $(dirname {})'

解释:

  1. 查找当前工作目录的所有子目录类型的文件
  2. 然后对于每个目录 d(严格一次一个),其直接子目录的名称为 d.xyz
  3. 打印目录名称

答案3

创建一个如下的 shell 脚本:

#!/bin/bash
rm -rf $(dirname $1)/$(basename $1 .$2)

并使用以下命令查找文件并删除目录:

find . -name "*.XXX" -exec /path/to/script {} XXX \;

将 XXX 替换为您要搜索的扩展名。

脚本的作用:

  • 第一个参数是文件的路径。
  • 第二个参数是您正在搜索的扩展。
  • dirname接收路径并返回文件所在的目录。
  • basename接收路径并返回文件名,并可选择删除后缀(在本例中为扩展名)。

find将搜索到的压缩文件的路径和扩展名传递给脚本,例如/path/to/script /home/user/test/file1.rar rar

dirname $1展开为dirname /home/user/test/file1.rar返回值/home/user/testbasename $1展开为basename /home/user/test/file1.rar rar返回值file1。将所有内容组合在一起,脚本即可执行rm -rf /home/user/test/file1

相关内容