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.