删除目录但不删除包含特定 .txt 文件的目录的脚本

删除目录但不删除包含特定 .txt 文件的目录的脚本

我得到了一个包含大量子目录的文件夹。

我需要删除所有这些文件,除了具有标记文件的文件夹,例如:所述文件夹内的 DONOTDELETE.txt。

这可能吗?

已经有一个预先决定 感谢 Benoit

( find /testftp -type d ;
  find /testftp -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
                     do
                        rm "$i/*";
                     done

但输出是:

rm:无法 lstat `/testftp/*':没有此文件或目录

rm:无法 lstat `/testftp/logs/*':没有此文件或目录

答案1

作为贝壳碎片:

for i in *; do
     [ -d "$i" ] || continue # ignore non-directories
     [ -f "$i/DONOTDELETE.txt ] && continue  # ignore directories containing DONOTDELETE
     rm -rf "$i"
done

答案2

我会怎么做(可能过于复杂):

  • 查找所有目录
  • 查找所有名为 DONOTDELETE.TXT 的文件并打印目录名称
  • 排序并保持唯一行

所以:

( find . -type d ;
  find . -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
                     do
                        rm "$i/*";
                     done

警告,如果您有以下树:

A/foo.txt
A/b/DONOTDELETE.TXT

那么这个最后一个脚本的输出仍然会输出,A因为它不包含名为 的文件DONOTDELETE.TXT

其他方式:

find . -type f ! -iname DONOTDELETE.txt -delete
find . -d -type d -empty -delete

首先删除所有没有此名称的文件,然后删除空目录(-d首先探索子树)。

答案3

find . -type f ! -name DONOTDELETE.txt  -print0 | xargs -0 ls -l

相关内容