我有一堆视频文件,我想根据我决定的文件大小对它们进行分类。
例子:
文件夹BB有 15 个大小各异的文件。
我将子文件夹设置为:
less than 100 MB -- folder A
100 MB to 500 MB -- folder B
more than 500 MB -- folder C
因此,无需手动操作,可以通过 Bash 或脚本来完成。
我大致知道该find
命令和适当的 if else 会起作用,但不知道如何编写脚本。
无论如何,通用的编程框架是:
float _size=[file_size]; // Reads the file size
if(_size<100) // File size is less than 100 MB
{ exec mv [file] /A/* ; // Move to folder A }
else if(_size>500) // File size is greater than 500 MB
{ exec mv [file] /C/* ; // Move to folder C }
else if((_size<=500)||(_size>=100)) //file size is between 100 to 500
{ exec mv [file] /B/* ; // Move to folder C}
else
{print("file error");}
所以我希望这很容易做到。以上只是我会做的一个大概的想法。
答案1
我建议用这个for
循环来循环当前目录中的所有文件:
for i in *; do
size=$(stat --printf="%s" "$i")
if [ $size -lt 100000000 ]; then
mv "$i" A/
elif [ $size -lt 500000000 ]; then
mv "$i" B/
else
mv "$i" C/
fi
done
您请求兆字节,如果你真的想要 100/500美比字节使用104857600
并524288000
相应。
如果目录包含其他文件而您只想处理例如.avi
文件,请使用:
for i in *.avi; do …
解释
for i in *; do … ; done
– 循环遍历当前目录中的所有文件size=$(stat --printf="%s" "$i")
– 使用获取文件大小(以字节为单位)stat
并将其保存为变量size
if A; then B; elif C; then D; else E; fi
– 如果 A 为真则执行 B,否则如果 C 为真则执行 D,否则执行 E[ $size -lt X ]
– 测试是否size
是l
esst
han Xmv "$i" Y/
– 将当前处理的文件移动到文件夹 Y 内
答案2
你可以用 GNU 做这种事find
,例如
find BB/ -type f \( -size -100M -exec mv -t A/ {} + \
-o -size +500M -exec mv -t C/ {} + -o -exec mv -t B/ {} + \)
笔记:
如果你想移动文件在同一棵树内(例如
A/
,B/
是C/
的子目录BB
),那么您将需要防止find
递归到这些目录,例如使用-maxdepth
或。-prune
由于 的舍入行为,需要小心谨慎
-size
。在这种情况下这不是问题,但例如-size -1M
会将所有小于 1024kB 的文件舍入到 1M,以便只有空文件匹配。
为了方便起见,使用千字节大小的文件进行测试:
$ tree -h somepath/
somepath/
├── [ 0] file0
├── [100K] file100
├── [150K] file150
├── [200K] file200
├── [250K] file250
├── [300K] file300
├── [350K] file350
├── [400K] file400
├── [450K] file450
├── [ 50K] file50
├── [500K] file500
├── [550K] file550
└── [600K] file600
0 directories, 13 files
然后
$ find somepath/ -type f \( -size -100k -exec mv -vt A/ {} + \
> -o -size +500k -exec mv -vt C/ {} + -o -exec mv -vt B/ {} + \)
'somepath/file50' -> 'A/file50'
'somepath/file0' -> 'A/file0'
'somepath/file550' -> 'C/file550'
'somepath/file600' -> 'C/file600'
'somepath/file250' -> 'B/file250'
'somepath/file200' -> 'B/file200'
'somepath/file100' -> 'B/file100'
'somepath/file300' -> 'B/file300'
'somepath/file500' -> 'B/file500'
'somepath/file350' -> 'B/file350'
'somepath/file450' -> 'B/file450'
'somepath/file400' -> 'B/file400'
'somepath/file150' -> 'B/file150'
给予
$ tree -h A B C
A
├── [ 0] file0
└── [ 50K] file50
B
├── [100K] file100
├── [150K] file150
├── [200K] file200
├── [250K] file250
├── [300K] file300
├── [350K] file350
├── [400K] file400
├── [450K] file450
└── [500K] file500
C
├── [550K] file550
└── [600K] file600
0 directories, 13 files