我得到了一个包含大量子目录的文件夹。
我需要删除所有这些文件,除了具有标记文件的文件夹,例如:所述文件夹内的 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