Как я выделяю несколько файлов на основе размера файла в подкаталог?

У меня есть набор видеофайлов, которые я хотел бы выделять на основе размера файла, который я решил.

Пример:

Папка BB имеет 15 файлов различного размера файла.

У меня есть sub набор папки как:

  1. less than 100 MB -- folder A
  2. 100 MB to 500 MB -- folder B
  3. more than 500 MB -- folder C

Таким образом вместо того, чтобы вручную делать это может это быть сделанным через Bash или сценарий.

У меня есть общее представление это find команда и надлежащее, если еще работал бы, но понятия не имел бы, как написать сценарий ее.

Так или иначе общий кадр программирования был бы:

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");}

Таким образом, я надеюсь, что легко сделать. Вышеупомянутое было просто общим представлением, которое я сделаю.

5
задан 7 October 2017 в 14:20

2 ответа

Я предлагаю циклично выполниться по всем файлам в текущем каталоге с этим 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 эс t ханьцы X
  • mv "$i" Y/, †“перемещают в настоящее время обрабатываемый файл в папке Y
7
ответ дан 23 November 2019 в 08:43

Можно сделать такого рода вещь с 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 КБ до 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
7
ответ дан 23 November 2019 в 08:43

Другие вопросы по тегам:

Похожие вопросы: