Script Bash pour rechercher et afficher le fichier le plus ancien

J’essaie d’écrire un script qui affichera le nom du fichier le plus ancien dans le répertoire à partir duquel le script est exécuté.

C’est ce que j’ai jusqu’à présent:

#!/bin/bash for arg in $* do oldest=$1 if [[ $arg -ot $oldest ]] then oldest=$arg fi done echo "Oldest file: $oldest" 

Je ne sais pas comment incrémenter le fichier suivant pour vérifier s’il est plus ancien

par exemple:

 oldest=$2 oldest=$3 etc.. 

en essayant d’exécuter ce script dans le shell bash avec les arguments suivants:

 myScript `ls -a` 

Je reçois un résultat de:

 Oldest File: . 

Le programme ls a une option pour sortinger à l’heure et vous pouvez simplement saisir le dernier fichier de cette sortie:

 # These are both "wun", not "ell". # vv oldest="$(ls -1t | tail -1)" 

Si vous souhaitez éviter les répertoires, vous pouvez les supprimer au préalable:

 # This one's an "ell", this is still a "wun". vv oldest="$(ls -lt | grep -v '^d' | tail -1 | awk '{print $NF}')" 

Je ne préconiserais pas normalement l’parsing des résultats, mais cela convient aux travaux rapides et sales, et si vous en comprenez les limites.


Si vous voulez un script qui fonctionnera même pour les fous qui insistent pour mettre des caractères de contrôle dans leurs noms de fichiers 🙂 alors cette page a quelques meilleures options, y compris:

 unset -v oldest for file in "$dir"/*; do [[ -z $oldest || $file -ot $oldest ]] && oldest=$file done 

Bien que je suggère de suivre ce lien pour comprendre pourquoi l’ parsing syntaxique de ls est généralement considérée comme une mauvaise idée (et donc pourquoi cela peut être utile dans des circonstances limitées, par exemple lorsque vous pouvez garantir que tous vos fichiers sont de type YYYY-MM-DD.log par exemple). Il y a une police d’informations utiles là-bas.

Vous pouvez utiliser cette fonction pour trouver le fichier / répertoire le plus ancien dans n’importe quel répertoire:

 oldest() { oldf= for f in *; do # not a file, ignore [[ ! -f "$f" ]] && continue # find oldest entry [[ -z "$oldf" ]] && oldf="$f" || [[ "$f" -ot "$oldf" ]] && oldf="$f" done printf '%s\n' "$oldf" } 

Et appelez-le dans n’importe quel répertoire comme:

 oldest 

Vous pouvez utiliser la commande find : find -type f -printf '%T+ %p\n' | sort | head -1 find -type f -printf '%T+ %p\n' | sort | head -1