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.