Dateien nach Änderungszeit sortieren

8

Ich habe hier viele Fragen und Antworten mit einer Konstruktion nach dem Vorbild von gesehen

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

oder

ls -t | while read i; do

Jetzt weiß ich, dass Sie ls nicht in Skripten verwenden sollten, da es leicht kaputt geht. Ich kann jedoch keinen besseren Weg finden, um Dateien in der Reihenfolge von zuletzt geändert zu zuletzt geändert (oder umgekehrt) zu bearbeiten.

Ich kann so etwas verwenden wie:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... aber dies wird immer noch mit allen Dateien brechen, deren Namen Zeilenumbrüche enthalten, und es ist viel hässlicher zu booten. Gibt es einen besseren Weg?

Übelsuppe
quelle

Antworten:

8

"Verwenden Sie ls nicht in Skripten" ist ein Problem mit POSIX ls "nur"; für GNU siehe --quoting-style=.

GNU sort löst das Problem mit --zero-terminated.

Wenn es kompatibel sein muss, können Sie jeweils find ... -execeinen Dateinamen an ein Skript übergeben, das die Escape-Funktion ausführt. Wenn mindestens Bash verfügbar ist:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
Hauke ​​Laging
quelle
Ahh, --zero-terminated- danke dafür, ich wünschte ich könnte dir noch mehr Punkte geben!
Evilsoup
... OK, ich bin ein wenig verwirrt von info ls: Wenn ich ein kugelsicheres Skript mit ls wollte, welches --quoting-stylesollte ich verwenden?
Evilsoup
@evilsoup Ich denke, --quoting-style=escapeist der Weg zu wählen.
Hauke ​​Laging
Nun, um einige Dateien mit Zeilenumbrüchen in ihren Namen zu erstellen, um es zu testen: P
Evilsoup
1
Außerdem: Ich stoße auf einen Extremfall, in dem GNU jemals ls --quoting-stylefehlschlägt (zum Parsen), weil es nur Dateinamen zitiert: wenn Sie ein Leerzeichen in einem Gruppennamen haben. Ok, es ist ein sehr seltsamer Fall, aber er erscheint in der Cygwin-Bash-Shell. Hier haben Sie Gruppennamen wie Domain Users.
DavAlPi
4

Der mit Abstand einfachste Weg ist die Verwendung von zsh. Das Glob-Qualifikationsmerkmal om sortiert Übereinstimmungen in umgekehrter chronologischer Reihenfolge. Verwendung Omfür die chronologische Reihenfolge.

for x in /path/to/dir/*(Nom); do …

Das NGlob-Qualifikationsmerkmal bewirkt, dass das Muster zu einer leeren Liste erweitert wird, wenn das Verzeichnis leer ist. Stellen Sie dies so ein *(DNom), dass es mit Punktdateien übereinstimmt.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Verdammt, dies ist das erste Mal, dass ich versucht bin, mir andere Muscheln anzusehen - das ist sehr schön.
Evilsoup