2
votes

Script shell Bash pour rechercher les fichiers manquants dans le nom de fichier

J'ai un dossier qui devrait contenir 1485 fichiers, nommé PA0001.png, PA0002.png ... jusqu'à PA1485.png

Certains d'entre eux manquent et j'aimerais écrire un script shell capable d'identifier les manquants et de les imprimer, sous forme de liste, dans un fichier .txt (de préférence sans la chaîne principale PA et l'extension .png, mais avec les zéros non significatifs, le cas échéant)

Je n'ai aucune idée de la façon de procéder, peut-être en utilisant awk? Mais je suis toujours un noob ... Toute aide serait très appréciée!


1 commentaires

3 Réponses :


4
votes

Vous pouvez obtenir la liste des numéros de séquence des fichiers manquants en utilisant la boucle bash

# Redirect output, per answer
exec > file.txt
for ((i=1 ; i<=1485 ; i++)) ; do
   # Convert to 4 digit zero padded
   printf -v id '%04d' $i
   if [ ! -f "PA$id.png" ] ; then
       echo $id
   fi
done


2 commentaires

Merci! Cela n'imprime pas les résultats dans un fichier .txt, non?


Vous pouvez utiliser la redirection - dans le script (voir script mis à jour), ou sur la ligne de commande



0
votes

Voici une légère refactorisation de la réponse existante, avec des explications dans les commentaires.

# Assign each number in the sequence to i; loop until we have done them all
for ((i=1 ; i<=1485 ; i++)) ; do
   # Format the number with padding for the file name part
   printf -v id '%04d' "$i"
   # If a file with this name does not exist,
   if [ ! -f "PA$id.png" ] ; then
       # Print it to standard output
       echo "$id"
   fi
# Redirect the loop's standard output to a file
done >missing.txt


0 commentaires

0
votes

Vous pouvez faire exactement cela sans une seule boucle Bash:

#!/usr/bin/env bash

{
  find . \
  -maxdepth 1 \
  -regextype posix-extended \
  -regex '.*/([[:digit:]]){4}\.png' \
  -printf '%f\n'
  printf '%04d.png\n' {1..1485}
} | sort | uniq --unique

Il combine la liste des fichiers avec la liste des fichiers attendus; puis triez et imprimez les entrées uniques qui sont celles qui ne sont que dans la liste attendue imprimée, il manque donc des fichiers.


0 commentaires