Sortieren Sie die Dateien im Verzeichnis rekursiv nach dem Datum der letzten Änderung

11

Sortieren Sie die Dateien im Verzeichnis rekursiv nach dem Datum der letzten Änderung

Ich habe viele Dateien in meinem Verzeichnis geändert. Ich möchte wissen, was diese Dateien sind, indem ich sie nach dem Datum der letzten Änderung sortiere. Darin möchte ich, dass einige der Erweiterungen ausgeschlossen werden

im svn-verzeichnis habe ich auch viele .svn-dateien, die ich nicht in der sortierung anzeigen möchte

Danny
quelle
Ich demonstriere, wie ich die Erweiterung in meiner Antwort ausschließen kann.
Mikeserv

Antworten:

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

wird dir so etwas geben

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

n.st
quelle
Kann ich eine Dateierweiterung aus dem Ordner ausschließen ....
Danny
@Danny Ja, das ist einfach mit find : find -not -iname '*.ext'.
n.st
find -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | sort -n das ist genau das, was ich brauchte, vielen Dank @ n.st
Danny
5

Wenn Sie die Verzeichnisstruktur findreduzieren möchten (also nach Datum über alle Dateien in allen Verzeichnissen sortieren und ignorieren möchten, in welchem ​​Verzeichnis sich die Dateien befinden), ist der von @yeti vorgeschlagene Ansatz der richtige Weg. Wenn Sie die Verzeichnisstruktur beibehalten möchten, können Sie es versuchen

$ ls -ltR /path/to/directory

welche sortiert Verzeichnis basierend.

Andreas Wiese
quelle
1
Dies gibt mir Ordner weise, wo als was ich alles zusammen ist, was sind die kürzlich geänderten Dateien
Danny
5

Führen Sie in bash shopt -s globstarzuerst aus. Führen Sie in ksh93 set -o globstarzuerst aus. In zsh sind Sie bereits eingestellt.

ls -dltr **/*

Dies gibt einen Fehler zurück, wenn Sie so viele Dateien haben, dass die Befehlszeilenlängenbeschränkung auf Ihrem System überschritten wird. In zsh können Sie stattdessen Folgendes verwenden:

print -rl -- **/*(Om)
Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist die einzige Antwort hier, die für Solaris 10 funktioniert, danke! :)
laxxy
3

Angenommen, Sie verwenden einen GNU-Fund, versuchen Sie Folgendes:

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

quelle
1
Sie könnten nutzen find‚s -printfMöglichkeit , einen separaten Prozess (oder mehr, je nach der Anzahl der Dateien) zu vermeiden aufgerufen wird . Siehe meine Antwort für ein Beispiel.
n.st
1
Zu wissen , dass es andere Möglichkeiten gibt , es zu tun, ich wollte geben , stateine Chance und zeigt -exec ... +. Ja wirklich! Manchmal denke ich, statverdient mehr Aufmerksamkeit ... und niemand sollte Rezepte von hier nehmen, ohne über die Zutaten zu lesen und über Konsequenzen nachzudenken ...
Übrigens ... nicht jeder Fund hat -printf...
1
@yeti - Wenn Sie findnicht haben -printf, können Sie verwenden -exec sh -c 'printf...', um viel von der gleichen Funktionalität zu erhalten. Dies würde auch den Zugriff auf $(pwd)vollständig qualifizierte Pfade einschließen .
MikeServ
2
Ich habe viele Linux-Benutzer getroffen, über die ich noch nie gelesen habe stat. Also manchmal möchte ich nur etwas Aufmerksamkeit auf stat... Ich denke, es statverdient ...
2

So listen Sie die Dateinamen nur mit den neuesten GNU-Tools auf:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
quelle
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Dadurch werden Probleme mit der Argumentliste vermieden, da das einzige Argument, lsdas jemals empfangen wird, der Name des Verzeichnisses ist, das aufgelistet werden soll. Sie können dies mit allem tun, was Sie möchten.

Die Schale nur . sourcesdie |pipeals Shell - Skript - es ist der gleiche Prozess und nicht über die Probleme auftreten können , wenn execveaufgerufen wird.

In jedem Fall - das oben genannte geht nur drei-tief, was durch Ändern einstellbar ist maxdepth. Es ist auch tief zuerst - so arbeiten Sie sich rückwärts zu Ihrem aktuellen Verzeichnis von depth.

Sie werden vielleicht bemerken, dass Sie auch $LSCOLORS- auf meinem Computer gibt es auch ordentlich gedruckte Spalten und alles andere, was Sie sich wünschen würden ls- oder alles, was Sie sich vorstellen können, mit dem Sie etwas anfangen möchten. source.

KEINE SVN

Auch dies wird alles tun, was Sie erwarten ls. Das Ausblenden von .svnDateien ist also so einfach wie das Ändern der lsZeile in:

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

Oder wenn Sie svnErweiterungen in jedem Ordner sehen möchten, ABER ./svnSie können sie so ändern, dass der gesamte Befehl folgendermaßen aussieht:

    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>&-

Persönlich mag ich es mit ls -sund, wenn Sie sich interessieren, -usortieren Sie nach Zugriffszeit und nicht nach Mod-Zeit.

mikeserv
quelle
1

Dieser listet alles files auf, <dir>wobei das oberste das älteste ist, das geändert wurde

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

Und damit ist die neueste Modifikation die höchste

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

Beachten Sie, dass dies nur funktioniert, wenn die Liste der Dateinamen die maximale Länge der Befehlszeilenlänge auf Ihrem System nicht überschreitet.

UnX
quelle
stimmt, das habe ich vergessen
UnX
als Referenz zum Befehl: arg list too long inulm.de/~mascheck/various/argmax
UnX
@ Gilles: Du meinst xargs -0(in beiden Fällen).  xargs -print0ist gleichbedeutend mit xargs -p -r -i -n -t -0oder xargs -inprt0oder xargs -0ntrip, was wahrscheinlich nicht das ist, was Sie gemeint haben.
Scott