5 votes

Comment séparer plusieurs fichiers en fonction de leur taille dans un sous-répertoire ?

J'ai un tas de fichiers vidéo que j'aimerais séparer en fonction de la taille du fichier que j'ai décidée.

Exemple :

Dossier BB comporte 15 fichiers de tailles différentes.

J'ai défini le sous-dossier comme suit

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

Ainsi, au lieu de le faire manuellement, peut-on le faire via Bash ou un script.

J'ai une idée générale que find et un if else approprié fonctionnerait, mais je n'ai aucune idée de comment script cela.

Quoi qu'il en soit, un cadre de programmation général serait le suivant :

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

J'espère donc que c'est facile à faire. Ce qui précède n'est qu'une idée générale que j'aurais faite.

7voto

dessert Points 36815

Je propose de passer en revue tous les fichiers du répertoire actuel avec la méthode suivante for boucle :

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

Vous avez demandé Mégaoctet si vous voulez vraiment 100/500 Mébibyte utiliser 104857600 y 524288000 en conséquence.

Si le répertoire contient d'autres fichiers et que vous souhaitez simplement traiter les fichiers suivants, par exemple .avi utiliser :

for i in *.avi; do …

Explications

  • for i in *; do … ; done - parcourir en boucle tous les fichiers du répertoire actuel
  • size=$(stat --printf="%s" "$i") - obtenir la taille du fichier en octets en utilisant stat et l'enregistrer en tant que variable size
  • if A; then B; elif C; then D; else E; fi - si A est vrai, faire B, sinon si C est vrai, faire D, sinon faire E
  • [ $size -lt X ] - vérifier si size est l ess t han X
  • mv "$i" Y/ - déplacer le fichier en cours de traitement dans le dossier Y

7voto

steeldriver Points 118154

Vous pouvez faire ce genre de choses avec GNU find par exemple

find BB/ -type f \( -size -100M -exec mv -t A/ {} + \
  -o -size +500M -exec mv -t C/ {} + -o -exec mv -t B/ {} + \)

NOTES :

  • Si vous souhaitez déplacer des fichiers au sein d'un même arbre (par exemple A/ , B/ , C/ sont des sous-répertoires de BB ), vous devrez alors empêcher find de la récursivité dans ces derniers, en utilisant -maxdepth o -prune par exemple.

  • Il convient d'être prudent en raison du comportement d'arrondi de -size . Ce n'est pas un problème dans ce cas, mais par exemple -size -1M arrondit tous les fichiers de moins de 1024kB à 1M de manière à ce que seuls les fichiers vides correspondent.

Test avec des fichiers de la taille d'un kilo-octet pour des raisons de commodité :

$ 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

entonces

$ 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'

donner

$ 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X