Comment obtenir la liste de tous les fichiers sous Annuaire actuel avec leur date de modification et trier à cette date?
Maintenant, je sais comment y parvenir avec find
, stat
et sort
, mais pour une raison aussi étrange que le stat
n'est pas installé sur la boîte et il est peu probable que je peux l'obtenir installé.
Toute autre option?
PS: gcc
n'est pas installé non plus
Ma méthode la plus courte utilise ZSH:
print -rl -- **/*(.Om)
(Ajoutez les qualificateurs D
Glob si vous souhaitez également répertorier les fichiers cachés ou les fichiers dans des annuaires cachés).
Si vous avez GNU trouve, faites-le imprimer les heures de modification de fichier et trier par cela. Je suppose qu'il n'y a pas de nouvelles lignes dans les noms de fichiers.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Si vous avez PERL (encore une fois, n'assumez aucune nouvelle lignes de noms de fichiers):
find . -type f -print |
Perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
Si vous avez Python (à nouveau, n'assumant aucune nouvelle lignes de noms de fichiers):
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
Si vous avez accès à SSH à ce serveur, montez le répertoire sur SSHFS sur une machine mieux équipée:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Avec seulement des outils POSIX, il est beaucoup plus compliqué, car il n'y a pas de bon moyen de trouver l'heure de modification d'un fichier. Le seul moyen standard de récupérer les temps d'un fichier est ls
et le format de sortie dépend des paramètres régionaux et difficiles à analyser.
Si vous pouvez écrire dans les fichiers et que vous ne vous souciez que des fichiers réguliers, et il n'y a pas de nouvelles lignes de noms, voici un horrible krudge: Créez des liens durs vers tous les fichiers d'un répertoire unique et triez-les par délai de modification.
set -ef # disable globbing
IFS='
' # split $(foo) only at newlines
set -- $(find . -type f) # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do # hard link the files to links.tmp/0, links.tmp/1, …
ln "../$f" $i
i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do # for each file, in reverse mtime order:
eval 'list="${'$i'} # prepend the file name to $list
$list"'
done
printf %s "$list" # print the output
rm -f [0-9]* # clean up
cd ..
rmdir links.tmp
En supposant GNU find
:
find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-
Changer 1n,1
à 1nr,1
Si vous souhaitez que les fichiers énumèrent le plus récent en premier.
Si vous n'avez pas GNU find
il devient plus difficile car ls
S TIMESTAMP Le format varie tellement (les fichiers récemment modifiés ont un style d'horodatage différent, pour Exemple).
Sur un Mac, il n'y a pas d'argument de printf à trouver, mais vous pouvez le faire à la place:
find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'
Parlant généralement de la recherche de fichiers par date (cela ne fonctionnera pas pour l'affiche originale, mais je me suis retrouvé ici, donc je pensais que les autres pourraient aussi bien). Dans mon cas d'utilisation, je souhaite énumérer les fichiers dans le but de les examiner avant la suppression.
Avec WinduTils 4.6.0 J'aime:
find . -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+
La commande ci-dessus trouve des fichiers (-type f
), dans le répertoire de travail actuel (.
) qui ont été modifiés il y a plus de 270 jours (-mtime +270
Aussi -mtime 0
produira les dernières 24 heures et -mtime -5
montre les 5 derniers jours). Il utilise ensuite ls
pour les énumérer par date, le plus récent premier (-exec ls -laFGht --time-style=iso {} \+
)
Voici un échantillon de la sortie:
-rwxrwx---+ 1 user1 208M 2018-07-16 ./filename.bak*
-rwxrwx---+ 1 user1 702 2018-07-15 ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15 ./filename.bak*
La grande chose à propos de ceci est qu'une fois la liste examinée, c'est une question simple pour remplacer la partie de liste avec la commande find
Supprimer:
find . -type f -mtime +270 -delete
Gère des espaces dans des noms de fichiers bien - pas que vous devriez utiliser ceux-ci!
$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10
2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht
plus find
galle peut être trouvé en suivant le lien.