web-dev-qa-db-fra.com

Comment répertorier les fichiers triés par la date de modification Récursivement (aucune commande STAT n'est disponible!)

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

31
alex

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).

14
geekosaur

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}'

7
killdash9

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
0
Steph

Ignorer les fichiers cachés - avec un timbre de temps agréable et rapide

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.

0
Serge Stroobandt