我有一组文件夹和一组*.DAT
文件。如果不存在同名(不带)的文件夹
,我想删除文件。 我花了一些时间才找到这个解决方案:*.DAT
.DAT
find . -type d > dirs.txt
for F in `find *.DAT`
do
F=$(sed 's|\.DAT||g' <<< $F)
if grep "$F" dirs.txt; then
echo "$F found"
else
rm $F.DAT
fi
done
但我觉得应该有一个更简单的解决方案(优雅的一行?无需创建文件?......?)。我说得对吗?
答案1
如果您正在使用,则无需使用sed
来删除:内置参数扩展无需使用子 shell 和外部程序即可实现相同的功能。.DAT
bash
${F%.DAT}
如果目录相对于文件位于任意位置.DAT
,则目录列表文件是解决问题的最有效方法,但鉴于两者都位于同一位置,更直接的答案是:
find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done
请注意,这将处理带有嵌入空格的文件名,而您的解决方案却不能。
对于其他 shell,可以使用类似的技术,但我不能代表它们发言。