Ordinare i file nella directory in modo ricorsivo in base alla data dell'ultima modifica


11

Ordinare i file nella directory in modo ricorsivo in base alla data dell'ultima modifica

Ho modificato molti file nella mia directory e voglio sapere quali sono quei file ordinandoli entro la data dell'ultima modifica e nel senso che alcune estensioni devono essere escluse

nella directory svn ho anche molti file .svn che non voglio mostrare nell'ordinamento


Demo come escludere l'estensione nella mia risposta.
Mikeserv,

Risposte:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

ti darà qualcosa di simile

2014-03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar


Posso escludere un'estensione di file dalla cartella ....
Danny

@Danny Sì, questo è facile con find: find -not -iname '*.ext'.
n.

trova -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | sort -n questo è esattamente ciò di cui avevo bisogno grazie mille @ n.st
Danny

5

Se vuoi appiattire la struttura della directory (ordinando così per data su tutti i file in tutte le directory, ignorando in quale directory si trovano i file), l' findapproccio suggerito da @yeti è la strada da percorrere. Se si desidera preservare la struttura delle directory, è possibile provare

$ ls -ltR /path/to/directory

che ordina in base alla directory.


1
questo mi dà una cartella saggia dove tutto ciò di cui ho bisogno è tutti insieme quali sono i file modificati di recente
Danny

5

In bash, corri per shopt -s globstarprimo. In ksh93, esegui set -o globstarprima. In zsh, sei già impostato.

ls -dltr **/*

Questo restituirà un errore se hai così tanti file che viene superato il limite di lunghezza della riga di comando sul tuo sistema. In zsh, puoi invece usare questo:

print -rl -- **/*(Om)

Questa è l'unica risposta che funziona per Solaris 10, grazie! :)
Lassxy

3

Supponendo che tu stia utilizzando GNU find, prova:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
È possibile utilizzare l find' -printfopzione per evitare di invocare un processo separato (o più, a seconda del numero di file). Vedi la mia risposta per un esempio.
n.

1
Sapendo che ci sono altri modi per farlo, ho voluto dare statuna possibilità e mostrare -exec ... +. Veramente! A volte penso, statmeriti più attenzione ... e nessuno dovrebbe prendere ricette da qui senza leggere gli ingredienti e pensare alle conseguenze ...

A proposito ... non tutte le -printf

1
@yeti - Se findnon lo hai -printf, puoi usare -exec sh -c 'printf...'per ottenere molte delle stesse funzionalità. Ciò includerebbe anche l'accesso a $(pwd)percorsi completamente qualificati.
Mikeserv,

2
Ho incontrato molti utenti Linux di cui non avevo mai letto stat. Quindi a volte voglio solo rivolgere un po 'di attenzione su stat... Penso che statse lo meriti ...

2

Per elencare in modo affidabile i nomi dei file solo usando i recenti strumenti GNU:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Ciò evita qualsiasi problema con l'elenco degli argomenti poiché l'unico argomento che lsverrà mai ricevuto è il nome della directory che si desidera elencare. Puoi farlo con qualsiasi cosa ti piaccia.

Il guscio solo . sourcesil |pipecome uno script di shell - E 'lo stesso processo e non ha i problemi che possono verificarsi quando si execveè chiamato.

In ogni caso - quanto sopra va solo a tre profondità che è regolabile cambiando maxdepth. Inoltre, per prima cosa approfondisce, quindi tornerai alla directory corrente da depth.

Potresti notare che ottieni anche $LSCOLORS- sulla mia macchina fornisce anche colonne stampate ordinatamente e tutto il resto da cui vorresti ls- o, del resto , qualsiasi cosa tu possa immaginare di voler fare. source.

NO SVN

Ancora una volta, questo farà tutto ciò che ti aspetti ls. Quindi nascondere i .svnfile è semplice come cambiare la lslinea in:

ls -t --color=always --hide="*svn" "%p"\n

O se vuoi vedere le svnestensioni in ogni cartella MA ./svnpuoi cambiarlo in modo che l'intero comando assomigli a questo:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Personalmente, mi piace con ls -se, se ti interessa, -uordinerò in base al tempo di accesso piuttosto che al tempo mod.


1

Questo elencherà il tutto files in <dir>alto con la modifica più antica

find <dir> -type f -print0 | xargs -0 ls -ltr

E con questo l'ultimo modificato è il massimo

find <dir> -type f -print0 | xargs -0 ls -lt

Nota che questo funziona solo se l'elenco dei nomi dei file non supera il limite di lunghezza totale della riga di comando sul tuo sistema.


vero, me ne sono dimenticato
UnX

come riferimento sul comando: arg list troppo a lungo inulm.de/~mascheck/various/argmax
UnX

@Gilles: Intendi xargs -0(in entrambi i casi).  xargs -print0è equivalente a xargs -p -r -i -n -t -0o xargs -inprt0o xargs -0ntrip, che probabilmente non è quello che intendevi.
Scott,
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.