Réévaluer la condition de boucle pour chaque exécution

J’ai une boucle pour lister les fichiers dans un répertoire puis, en fonction de leurs noms, les déplace dans différents dossiers appropriés.

Disons qu’il y a 300 fichiers comme ci-dessous:

  1. Prefix_filename1_suffix1_date.txt – 100 fichiers
  2. Prefix_filename101_suffix2_date.txt – 150 fichiers
  3. Prefix_filename251_suffix3_date.txt – 50 fichiers

Je ne connais que le préfixe et l’emplacement du dossier des fichiers au début de la boucle:

 cd folder_location for f in $(ls ${file_prefix}*); do 

Les noms de fichiers me seraient connus après que j’entre dans la boucle for – c’est un défi.

J’utilise une expression régulière pour trouver un suffixe commun à tous les fichiers, puis utilisez awk pour obtenir un nom de fichier entre le préfixe et le suffixe. Donc, pour utiliser regex et awk j’ai besoin des noms de fichiers pour parcourir la boucle for .

Lors du traitement de ces fichiers, je déplace tous les fichiers similaires ensemble (donc, s’il y a trois jeux de fichiers), les fichiers peuvent être déplacés dans 3 exécutions (disons les 1er, 101e et 251e) et les 297 autres ne le font pas. n’importe quoi car il n’y a pas de fichiers à traiter, car il a répertorié 300 fichiers – à l’origine, la boucle s’exécute 300 fois.

Comment puis-je éviter cela? Et faites en sorte que la boucle ne soit exécutée que 3 fois.

En supposant que les noms de fichiers ne contiennent que ces caractères de soulignement dans les emplacements indiqués (pas dans le préfixe , le nom ou le suffixe ), il suffit de cut le troisième champ (le suffixe ) et de sort -u . Pipe-le dans une boucle et mv les fichiers correspondants dans leurs sous-répertoires ad hoc .

 cd folder_location echo ${file_prefix}*.txt | cut -d '_' -f 3 | sort -u | \ while read suffix ; do [ -d ${suffix} ] || mkdir ${suffix} mv ${file_prefix}*_${suffix}_*.txt ${suffix}/ done