1 votes

Extraire les 100 derniers fichiers dans tous les sous-répertoires, chaque répertoire ayant un nombre variable de fichiers.

J'ai un répertoire avec 6 sous-répertoires. Chaque sous-répertoire a également un nombre variable de sous-répertoires. Ces derniers répertoires ont un nombre variable de *.jpg fichiers. Les fichiers jpg sont nommés sous la forme 0000.jpg , 0001.jpg et ainsi de suite.

Je suis intéressé par l'obtention des 100 derniers *.jpg fichiers (tous les répertoires ont > 100 fichiers), et les stocker dans des répertoires séparés avec une structure similaire à celle des répertoires originaux.

Quelle est la meilleure façon de procéder ?

0voto

Zanna Points 65764

Dans le parent avec les 6 sous-répertoires :

mkdir ../newdirs

Ensuite :

for d in */*; do mkdir -p ../newdirs/"$d"; i=0; j=$(stat "$d"/* --printf "%i\n" | wc -l); for f in "$d"/*; do [[ -f "$f" ]] && (( (j - ++i) < 100 )) && echo mv -v -- "$f" ../newdirs/"$d"; done; done

Retirer echo après avoir testé pour déplacer les fichiers.
Plus lisiblement :

for d in */*; do 
  mkdir -p ../newdirs/"$d" 
  i=0
  j=$(stat "$d"/* --printf "%i\n" | wc -l)
  for f in "$d"/*; do 
    [[ -f "$f" ]] && 
    (( (j - ++i) < 100 )) && 
      echo mv -v -- "$f" ../newdirs/"$d"
  done
done

Notas

  • mkdir ../newdirs créer un nouveau répertoire pour les fichiers déplacés au même niveau que le répertoire actuel (c'est à dire dans le parent .. des deux)
  • for d in */*; do pour chaque sous-sous-répertoire...
  • mkdir -p ../newdirs/"$d" créer un répertoire dans la structure parallèle, en utilisant -p pour créer des répertoires parents si nécessaire et
  • i=0 mettre une variable à 0 pour compter les itérations
  • j=$(stat "$d"/* --printf "%i\n" | wc -l) compter les fichiers dans le sous-sous-répertoire et attribuer ce nombre à j
  • for f in "$d"/*; do pour tout le contenu des sous-sous-répertoires
  • [[ -f "$f" ]] && si c'est un fichier
  • (( (j - ++i) < 100 )) && et si le nombre de fichiers dans le répertoire moins le nombre de fois que la boucle a été exécutée est inférieur à 100, alors...
  • mv -v -- "$f" ../newdirs/"$d" déplacer le fichier vers le répertoire correspondant dans la nouvelle structure.

for itère sur les fichiers de manière ordonnée, donc cette méthode donnera les 100 derniers fichiers tels que listés numériquement.

Vous pouvez régler ../newdirs au chemin que vous voulez.

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