我一直在寻找一个代码片段放在.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 {})'
解释:
- 查找当前工作目录的所有子目录类型的文件
- 然后对于每个目录 d(严格一次一个),其直接子目录的名称为 d.xyz
- 打印目录名称
答案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/test
,basename $1
展开为basename /home/user/test/file1.rar rar
返回值file1
。将所有内容组合在一起,脚本即可执行rm -rf /home/user/test/file1
。