Recherche d'une commande qui renverra le fichier le plus récent dans un répertoire.
Ne pas voir un paramètre de limite à ls
...
linux
command-line
accuser
la source
la source
watch -n1 'ls -Art | tail -n 1'
- affiche les tout derniers fichiersls
ou l'utilisationfind
sans-print0
laquelle est problématique pour gérer les noms de fichiers ennuyeux. Toujours utile de mentionner: BashFAQ099 qui donne une réponse POSIX à ce problèmeRéponses:
Pas très élégant, mais ça marche.
la source
ls
verstail
, puis n'imprime que la dernière ligne. À mon humble avis, il est préférable de trier par ordre croissant et d'utiliser à lahead
place, commechaos
suggéré. Après l'impression, l'en-tête de la première ligne se ferme, donc l'envoi de la ligne suivante (en fait le bloc suivant) augmentera un SIGPIPE et sels
fermera également.Cette commande donne en fait le dernier fichier modifié dans le répertoire de travail actuel.
la source
ls -tl | head -n 1
, et il n'est pas nécessaire de pousser toute la table à travers le tube comme le fait le mien.ls -t *.png | head -n1
ls -Art | head -n1
si vous voulez spécifiquement le dernier fichier modifiéIl s'agit d'une version récursive (c'est-à-dire qu'elle trouve le fichier le plus récemment mis à jour dans un certain répertoire ou dans l'un de ses sous-répertoires)
Edit: utilisez
-f 2-
plutôt-f 2
que comme suggéré par Kevinla source
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
, vous pouvez utiliser à lahead -n 1
place detail -n 1
et améliorer légèrement l'efficacité. (Bien que si vous triez une recherche récursive, obtenir la première ou la dernière ligne ne sera pas la partie la plus lente.)find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
Une note sur la fiabilité:
Puisque le caractère de nouvelle ligne est aussi valide que n'importe quel autre dans un nom de fichier, toute solution qui repose sur des lignes comme celles basées sur
head
/tail
est imparfaite.Avec GNU
ls
, une autre option consiste à utiliser l'--quoting-style=shell-always
option et unbash
tableau:(ajoutez l'
-A
option àls
si vous souhaitez également prendre en compte les fichiers cachés).Si vous voulez vous limiter aux fichiers normaux (ne pas tenir compte des répertoires, des fifos, des périphériques, des liens symboliques, des sockets ...), vous devez recourir à GNU
find
.Avec bash 4.4 ou plus récent (pour
readarray -d
) et GNU coreutils 8.25 ou plus récent (pourcut -z
):Ou récursivement:
Le mieux ici serait d'utiliser
zsh
et ses qualificatifs glob au lieu d'bash
éviter tous ces tracas:Le fichier régulier le plus récent dans le répertoire courant:
Y compris les cachés:
Deuxième plus récent:
Vérifiez l'âge du fichier après la résolution du lien symbolique:
Récursivement:
En outre, avec le système de complétion (
compinit
et co) activé, Ctrl+Xmdevient un complément qui se développe au fichier le plus récent.Alors:
Vous ferait éditer le fichier le plus récent (vous aurez également une chance de voir lequel il avant d'appuyer sur Return).
Pour le deuxième fichier le plus récent.
pour le
c
fichier le plus récent .pour le fichier régulier le plus récent (pas de répertoire, ni de fifo / périphérique ...), et ainsi de suite.
la source
zsh
conseils. Pourriez-vous fournir un lien vers plus de détails à ce sujet dans la documentation zsh?info zsh qualifiers
J'utilise:
ls -ABrt1 --group-directories-first | tail -n1
Il me donne juste le nom du fichier, à l'exclusion des dossiers.
la source
ls -lAtr | tail -1
Les autres solutions n'incluent pas les fichiers commençant par
'.'
.Cette commande comprendra également
'.'
et'..'
, qui peut ou non être ce que vous voulez:ls -latr | tail -1
la source
Variante raccourcie basée sur la réponse de dmckee:
la source
-1
syntaxe en tête a été obsolète il y a un certain temps et-n 1
devrait être utilisée.J'aime
echo *(om[1])
(lazsh
syntaxe) car cela donne simplement le nom du fichier et n'invoque aucune autre commande.la source
La solution de recherche / tri fonctionne très bien jusqu'à ce que le nombre de fichiers devienne vraiment important (comme un système de fichiers entier). Utilisez plutôt awk pour garder une trace du fichier le plus récent:
la source
bash
Personnellement, je préfère utiliser le moins de commandes non intégrées que possible (pour réduire le nombre d'appels système coûteux de fork et exec). Pour trier par date lels
besoin d'être appelé. Mais l'utilisation dehead
n'est pas vraiment nécessaire. J'utilise le one-liner suivant (fonctionne uniquement sur les systèmes prenant en charge les tuyaux de nom):ou pour obtenir le nom du fichier le plus ancien
(Attention à l'espace entre les deux marques '<'!)
Si les fichiers cachés sont également nécessaires, un argument peut être ajouté.
J'espère que cela pourrait aider.
la source
en utilisant l'option récursive R .. vous pouvez considérer cela comme une amélioration pour de bonnes réponses ici
la source
Affiche le dernier élément modifié dans le dossier. Associer avec
grep
pour trouver les dernières entrées avec des mots-clésla source
1
est pour la première ligne équivaut àhead -n 1
ce qu'est q?Récursivement:
la source
essayez cette simple commande
Si vous voulez un nom de fichier - dernière modification, chemin = /ab/cd/*.log
Si vous voulez le nom du répertoire - dernière modification, chemin = / ab / cd / * /
la source
En supposant que vous ne vous souciez pas des fichiers cachés commençant par un
.
Autrement
la source
Avec uniquement des fonctions intégrées Bash, suivant de près BashFAQ / 003 :
la source
Toutes ces solutions ls / tail fonctionnent parfaitement bien pour les fichiers dans un répertoire - en ignorant les sous-répertoires.
Afin d'inclure tous les fichiers dans votre recherche (récursivement), find peut être utilisé. gioele a suggéré de trier la sortie de recherche formatée. Mais soyez prudent avec les espaces (sa suggestion ne fonctionne pas avec les espaces).
Cela devrait fonctionner avec tous les noms de fichiers:
Cela trie par mtime, voir man find:
Donc, remplacez simplement
%T
par%C
pour trier par ctime.la source
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Ou bien, gardez tout sauf le premier champ:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Recherche du fichier le plus récent dans chaque répertoire selon un modèle, par exemple les sous-répertoires du répertoire de travail dont le nom se termine par "tmp" (insensible à la casse):
la source
la source
Si vous souhaitez obtenir le fichier modifié le plus récent, y compris tous les sous-répertoires, vous pouvez le faire avec ce petit oneliner:
Si vous ne voulez pas faire de même pour les fichiers modifiés, mais pour les fichiers accédés, vous devez simplement changer le
% Y paramètre de la stat commande à X% . Et votre commande pour les fichiers consultés les plus récents ressemble à ceci:
Pour les deux commandes, vous pouvez également modifier le paramètre var = "1" si vous souhaitez répertorier plusieurs fichiers.
la source
J'avais besoin de le faire aussi, et j'ai trouvé ces commandes. ceux-ci fonctionnent pour moi:
Si vous voulez le dernier fichier par sa date de création dans le dossier (temps d'accès):
Et si vous voulez le dernier fichier dont le contenu a changé (heure de modification):
la source