问题

问题

问题

在当前工作目录我有几个(非常多)文件夹,其中一些文件夹内有大量(例如 100,000 多个)文件。

我的目标是只获取包含 10,000 多个文件的文件夹并删除folderName10001.ext以上文件(其中folderName是包含文件夹的实际名称,并且ext任何扩大)。

采取的方法

我正在尝试使用nameFolder numberOfFiles打印bash

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {}; ls {} | wc -l" \;

这工作得很好(对于示例文件夹acer),但输出是

./acer
6058

我希望每个文件夹有 1 行输出

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} `ls {} | wc -l`" \;

ls: cannot access {}: No such file or directory


问题

  1. 我怎样才能在一行中显示nameFolder numberOfFiles
  2. 有没有更简单的方法来删除每个文件folderName/folderName#.ext,使用#> 10000

问题2

更多细节可能有助于了解发生了什么。

我有一个包含以下树的文件夹

.
├── a
│   ├── a1.ext
│   ├── a2.ext
│   ├── a3.ext
│   └── a4.ext
├── b
│   ├── b1.ext
│   ├── b2.ext
│   ├── b3.ext
│   └── b4.ext
└── c
    ├── c1.ext
    ├── c2.ext
    ├── c3.ext
    └── c4.ext

我想删除每个编号大于2. (在我的具体情况下,阈值设置为10000。)


答案1

这全都是关于WHO解释什么(谢谢@布拉奇利以获得评论中的建议)。

由于我正在输入bashbash因此首先解释我输入的内容。如果我想bash发送findbash反引号,那么我需要逃脱它。

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} \`ls {} | wc -l;\`" \;

这给了我

./acer 6058

@巴马尔 指出单身的-双引号行为不同,因此

find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} `ls {} | wc -l`' \;

会工作得很好(注意"替换为')。

答案2

这是由提供的沃尔特·A,这是接受的答案对于这个问题。

更多错误(下面是几个示例)...

black: 390120
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.

leather: 118240
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.

好的,我已经修复了

ls -d */ | cut -d/ -f1 | while read dir; do
COUNT=$(ls $dir | wc -l);
   if [ ${COUNT} -gt 10000 ]; then
      echo "$dir: ${COUNT}" ;
      for i in `seq 10001 ${COUNT}`; do
         rm ${dir}/${dir}${i}.*
      done
   fi
done

答案1

使用单引号而不是双引号,这样反引号就$不会被原始 shell 解释:

find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} $(ls {} | wc -l)' \;

对于第二个问题,我会将您想要执行的操作放入一个单独的脚本中,该脚本将目录名称作为参数。然后做:

find . -maxdepth 1 -type d -name 'acer' -exec ./scriptname {} \;

这样您就不必处理使用-exec sh -c.

答案2

你可以写

ls -d */ | while read dir; do
    echo "$dir: $(ls $dir | wc -l)"
done

当文件名编号没有前导零时,您可以尝试

ls -d */ | cut -d/ -f1 | while read dir; do
     COUNT=$(ls $dir | wc -l);
     echo "$dir: ${COUNT}" ;
     if [ ${COUNT} -gt 10000 ]; then
        ls ${dir}/${dir}?????*.ext | grep -v ${dir}/${dir}10000.ext | xargs rm
     fi
done

当文件名中有前导零时,可以采用另一种方法:

ls -d */ | cut -d/ -f1 | while read dir; do
   ls ${dir}/${dir}*.ext | tail -n +10001 | xargs rm
done

编辑:在 ls 命令中包含 dir+filename,并且我添加了cut -d/ -f1 |以切断尾随 / 的功能。

相关内容