如何查找并删除包含少于 100 个文件(或 200 个文件)的子目录?
我找到并使用了以下命令,但不知道如何删除列出的子目录。 (我有超过1000个这样的文件夹和子目录,无法手动完成)。
find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | awk '$NF<=10'
谢谢你!
答案1
下面我已经回答了您的问题,但我想强调您需要极其谨慎地使用此命令。原始文件的输出awk
正在通过管道传输到rm -rf
,这意味着该命令将强制删除列出的所有文件夹。
确保您在运行此程序的位置非常小心,因为如果在大多数地方运行,这可能会导致严重的问题或对系统造成无法修复的损坏。
find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; -print0 | awk '$NF<=10' | xargs rm -rf
原始命令的输出被通过管道传输到xarge rm -rf
,xargs
正在将原始输出转换为另一个程序的参数,在本例中为rm
。
摘自rm
正在使用的两个开关的联机帮助页:
-f, --force
ignore nonexistent files, never prompt
-r, -R, --recursive
remove directories and their contents recursively
直接通过管道传输rm
是行不通的,因为它不希望接收该格式的文件或文件夹名称。
答案2
在zsh
:
for d (**/*(Nod/))
()(($#)) $d/*(ND.Y100[100]) ||
()(($#)) $d/*(ND/Y1) ||
rm -rf -- $d
将删除不包含 100 个或更多常规文件且不包含子目录的非隐藏目录。这是深度优先处理的,因此如果目录有要删除的子目录,则目录有机会被删除。
**/
匹配任何级别的子目录(Nod/)
//(NDoN.[100])
:(ND/Y1)
glob 限定符,用于根据其他条件进一步限定 glob:N
: nullglob:如果没有匹配,不要将其视为致命错误,而是让 glob 扩展为空。D
: dotglob: 不要忽略隐藏 (D
ot) 文件。od
:o
rderd
epth 首先(在它们所在的分支之前离开)oN
: 不用N
麻烦o
排序列表/
:限制文件类型目录.
:限制文件类型常规的。更改为^/
考虑任何类型的文件,除了目录反而。Y1
/Y100
:在 1/100 匹配后停止搜索,甚至不进行排序[100]
:仅选择第 100 个匹配Y100[100]
项;如果有 100 个或更多,则so将使 glob 结果在一个文件中,或者没有,否则以比[100]
单独使用更有效的方式,它会找到所有匹配项,对列表进行排序并选择第 100个。
(){body} args
args
:运行一个带有参数的匿名函数。(($#))
因为匿名函数的主体是一个算术表达式,如果表达式的计算结果为 0 以外的数字,则返回 true。因此,这里 if$#
,匿名函数的参数数量非零。
答案3
下面的脚本是肮脏但有效的解决方案。
在工作计算机上应用之前在测试环境上运行此脚本,因为它将删除内容
cd desired_directory
for i in `find . -maxdepth 1 -type d | grep "/"`
do
cd $i;
j=`echo \`ls -l | wc -l\` | bc`
[ $j -lt "100" ] && echo "Lesser than 100 files/directories in $i"
cd ../
done
在这里,您必须将echo
语句替换为rm -rf
or mv
。