我需要编写一个脚本来查找名称中包含字符串的文件。如果存在同名但没有该字符串的文件,我想删除原始文件。
例如,如果我位于包含以下文件的目录中:
algomb
gomba
alb
algomba
alba
如果子字符串是gom
那么我会考虑algomb
, gomba
, 和algomba
。gom
从每个名称中删除后,我将检查alb
、ba
和是否存在alba
。其中,alb
确实alba
存在,所以我会删除algomb
并algomba
留下
alb
alba
gomba
当我完成后在目录中。
这是我尝试过的:
#!/bin/bash
sz="gom"
talal=`find . -type f -name "*$sz*" -exec basename {} \;`
ossz=`find . -type f -exec basename {} \;`
c=`echo ${talal%%:*}${talal##*:}`
for c in ossz; do
if [ ! -d ]; then
echo "This is a directory"
else
if [ -f ];
then
find .-type f -name "*$sz*" -exec basename {} \;
else
echo ${talal%%:*}${talal##*:}
fi
fi
done
所以这是有效的。这echo ${talal%%:*}${talal##*:}
是返回不带“gom”的文件名。但我无法将这些值与 find . -type f -exec basename {} \;
结果进行比较。
鉴于我可以找到子字符串,我如何测试文件并删除适当的文件?
答案1
以下内容应该满足您的要求:
#!/bin/bash
sz="gom"
dir="/where/the/files/are"
find $dir -type f -name "*${sz}*" -print0 | while read -d '' -r c; do
if [[ -f "$(echo $c | sed 's/'"${sz}"'//g')" ]]; then
# Strip the 'echo' to have this actually do things
echo rm -v "$c"
fi
done
有关更改和修复的一些说明:
- Find
-printf "%f\n"
优于-exec basename {} \;
.在这种情况下,我删除了 find 剥离目录名,以便脚本对于非平面目录结构是安全的。 for c in ossz
不应该起作用 - 裸名ossz
不是变量。$ossz
会需要的。- 出于可读性原因,使用
sed
可能比依赖 bash 模式匹配和替换更可取。
例子:
对于包含以下文件的目录:
alb alba algomb algomba gomb
上面的脚本将输出以下内容:
rm -v ./algomb
rm -v ./algomba