Come elencare i file in modo ricorsivo e ordinarli in base al tempo di modifica?


13

Come posso elencare ricorsivamente tutti i file in una directory e ordinare l'output in base al tempo di modifica?

Normalmente uso ls -lhtcma non trova tutti i file in modo ricorsivo. Sto usando Linux e Mac.

ls -l su Mac OS X può dare

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

dove la parte della data non è coerente o allineata, quindi una soluzione deve tenerne conto.

Soluzione parziale

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

funziona, ma non in modo ricorsivo.


Suppongo che tu sia su Linux, ma dovresti specificare esplicitamente il tuo sistema operativo nella domanda o preferibilmente come tag.
EBGreen

Risposte:


2

Ecco un metodo che usa statcome suggerito da @ johnshen64

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-

find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-stamperebbe solo i percorsi assoluti dei file su OS X.
Lri,

quale versione di statstai usando? il tuo formato sopra non ha funzionato per me. Ho dovuto usare la seguente: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Questo è constat (GNU coreutils) 8.23
user84207

12

Usa finds' -printfe una specie su un formato di data ragionevole:

find -type f -printf '%T+\t%p\n' | sort -n

Questo dovrebbe minimizzare le forcelle di processo e quindi essere il più veloce.

Esempi se non ti piace la seconda parte frazionaria (che spesso non è implementata nel file system):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: lo standard findsu Mac non ha -printf. Ma non è difficile installare GNU find su Mac (vedi anche quel link per ulteriori avvertenze sulla compatibilità Mac / Linux e xargs).


0

find .dovrebbe essere in grado di ottenere tutti i file. Qualcosa come questo:

find . -exec ls -dl '{}' \; | sort -k 6,7

Devi sintonizzarlo per le tue esigenze.


suppongo anche che sia Linux, come ha detto EBGreen, ls è un alias in Windows PS, quindi è necessario utilizzare sort-object e ottenere elementi figlio in modo ricorsivo se è così, ma l'idea è la stessa.
johnshen64,

Funziona davvero correttamente quando le date a volte mancano la parte dell'anno, su Mac?
qazwsx,

hai ragione, la visualizzazione della data per i file recenti rovinerà le cose. devi usare stat invece per ottenere la data esattamente formattata in quel caso. i miei file sono tutti molto vecchi quindi il comando ha funzionato bene, ecco perché ho aggiunto la clausola tune :-)
johnshen64

@ johnshen64: lssu Linux è disponibile --time-formatun'opzione per garantire che le date dei file recenti e precedenti siano visualizzate nello stesso formato.
RedGrittyBrick

ah grazie, hai ragione, non l'ho mai usato. è molto più semplice dell'uso di stat. si chiama - time-style penso.
johnshen64,

0

Questa risposta a una domanda simile sul sito Unix Stack Exchange mi ha aiutato perché stavo usando zsh:

Come elencare i file ordinati in modo ricorsivo per data di modifica (nessun comando stat disponibile!)


Questo è davvero un commento e non una risposta alla domanda originale. Puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post . Si prega di leggere Perché ho bisogno di 50 reputazione per commentare? Cosa posso fare invece?
DavidPostill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.