问题
在当前工作目录我有几个(非常多)文件夹,其中一些文件夹内有大量(例如 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
。
问题
- 我怎样才能在一行中显示
nameFolder numberOfFiles
? - 有没有更简单的方法来删除每个文件
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解释什么(谢谢@布拉奇利以获得评论中的建议)。
由于我正在输入bash
,bash
因此首先解释我输入的内容。如果我想bash
发送find
至bash
反引号,那么我需要逃脱它。
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 |
以切断尾随 / 的功能。