У меня есть куча видеофайлов, которые я бы хотел разделить на основе размера файла, который я решил.
Пример:
Папка 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");}
Так что я надеюсь, что это легко сделать. Выше была только общая идея, которую я бы сделал.
Я предлагаю перебрать все файлы в текущем каталоге с помощью этого цикла 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 Mebibyte 104857600 и 524288000 соответственно.
Если каталог содержит другие файлы, и вы просто хотите обработать, например .avi, используйте:
for i in *.avi; do …
Я предлагаю перебрать все файлы в текущем каталоге с помощью этого цикла 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 Mebibyte 104857600 и 524288000 соответственно.
Если каталог содержит другие файлы, и вы просто хотите обработать, например .avi, используйте:
for i in *.avi; do …
Я предлагаю перебрать все файлы в текущем каталоге с помощью этого цикла 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 Mebibyte 104857600 и 524288000 соответственно.
Если каталог содержит другие файлы, и вы просто хотите обработать, например .avi, используйте:
for i in *.avi; do …
Вы можете делать такие вещи с помощью 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 будет охватывать все файлы размером менее 1024 КБ до 1 М, что соответствует только пустым файлам.Тестирование с помощью файлов размером в килобайт для удобства:
$ 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
Вы можете делать такие вещи с помощью 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 будет охватывать все файлы размером менее 1024 КБ до 1 М, что соответствует только пустым файлам.Тестирование с помощью файлов размером в килобайт для удобства:
$ 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
Вы можете делать такие вещи с помощью 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 будет охватывать все файлы размером менее 1024 КБ до 1 М, что соответствует только пустым файлам.Тестирование с помощью файлов размером в килобайт для удобства:
$ 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