如何删除包含少于一定数量文件的目录

如何删除包含少于一定数量文件的目录

如何查找并删除包含少于 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 -rfxargs正在将原始输出转换为另一个程序的参数,在本例中为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: 不要忽略隐藏 ( Dot) 文件。
    • odorder depth 首先(在它们所在的分支之前离开)
    • oN: 不用N麻烦o排序列表
    • /:限制文件类型目录
    • .:限制文件类型常规的。更改为^/考虑任何类型的文件,除了目录反而。
    • Y1/ Y100:在 1/100 匹配后停止搜索,甚至不进行排序
    • [100]:仅选择第 100 个匹配Y100[100]项;如果有 100 个或更多,则so将使 glob 结果在一个文件中,或者没有,否则以比[100]单独使用更有效的方式,它会找到所有匹配项,对列表进行排序并选择第 100
  • (){body} argsargs:运行一个带有参数的匿名函数。
  • (($#))因为匿名函数的主体是一个算术表达式,如果表达式的计算结果为 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 -rfor mv

相关内容