Shell 脚本:当同名文件夹不存在时删除文件

Shell 脚本:当同名文件夹不存在时删除文件

我有一组文件夹和一组*.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 和外部程序即可实现相同的功能。.DATbash${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,可以使用类似的技术,但我不能代表它们发言。

相关内容