GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie sortiere ich Dateinamen in numerischer Reihenfolge und in geänderter zeitlicher Reihenfolge?

Ich möchte PDF-Dateien mit pdfjoin verbinden /pdfunite /… in der numerischen Reihenfolge, die im Thread „Antwort zum Linux-Befehl“ gut besprochen wurde, PDF-Dateien mit numerischer Sortierung und Geändert zusammenführen Zeitreihenfolge.
Wenn Sie die Lösung im Thread verwenden, setzt sie die Reihenfolge in die numerische Reihenfolge und die alphabetische Reihenfolge.
Dies ist problematisch bei den Dateinamen, z. B. wenn Sie sehen, dass beide die gleiche Änderungszeit von haben minutengenau, aber Visceral ist um Sekunden genauer (der Dateibrowser merkt es und fügt Visceral zuerst im Modified bestellen.

Filename               Modified
-----                  ---
3.THE ABC.pdf          10:39 
3.Visceral abc..pdf    10:39

Vollständige Dateinamen

1.Description abc.pdf
2.Gabcd.pdf
3.THE ABC.pdf
3.Visceral abc..pdf
4.description of abc.pdf
5.Chraa..pdf

Vorschlag #1 funktioniert in der numerischen und alphabetischen Reihenfolge, aber nicht in der numerischen und modifizierten Reihenfolge

# https://stackoverflow.com/a/23643544/54964
ls -v *.pdf | ...
    bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

Vorschlag Nr. 2 vereinfacht den Fall, behandelt jedoch keine Leerzeichen und andere Sonderzeichen in Dateinamen

# https://stackoverflow.com/a/23643544/54964
pdfunite $(ls *.pdf | sort -n) output.pdf

In pdfunite --help steht nichts über die Bestellung, also denke ich, dass es von ls gemacht werden sollte /sort /…
Der Befehl sort hat nichts über modified in seiner Manpage.

Testen von xhiennes Antwort

Die Reihenfolge in der Ausgabe, in der Sie 2.jpg sehen, ist nicht korrekt und 4.jpg sind aus irgendeinem Grund in der falschen Reihenfolge

[email protected]:~/Documents$ ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

Zweite Iteration

export LC_ALL=C; ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s

Ausgabe

//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

Betriebssystem:Debian 8.5

Akzeptierte Antwort:

Das könntest du mit zsh machen :

zmodload zsh/stat

prefixmtime () {
sortstring=${(l:6::0:)${REPLY%%.*}}$(zstat -F '%s' +mtime -- $REPLY)
REPLY=${sortstring}
}

print -rl -- *(o+prefixmtime)

Ersetzen Sie print -rl mit Ihrem Befehl, wenn Sie mit dem Ergebnis zufrieden sind

Wie es funktioniert:
Die Globs werden hier sortiert (über o+function ) basierend darauf, was die Funktion prefixmtime zurückgibt, also sortstring Dabei handelt es sich um eine Zeichenfolge, die durch Verketten des numerischen Präfixes jedes Dateinamens ${REPLY%%.*} erhalten wird links mit Nullen aufgefüllt (l:6::0:) (vorausgesetzt Präfixe sind bis zu 6 Zeichen lang) und die mtime in Sekunden (erhalten über zstat Modul). Es ist möglicherweise einfacher zu verstehen, wie es funktioniert, wenn Sie Folgendes ausführen:

{ for f (*)
printf '%s %s\n' ${(l:6::0:)${f%%.*}}$(zstat -F '%s' +mtime -- $f) $f
} | sort -k1,1n

Beachten Sie, dass das Obige davon ausgeht, dass Sie sich im selben Verzeichnis wie Ihre Dateien befinden, andernfalls müssen Sie die Sortierzeichenfolge in dieser Funktion als

definieren
sortstring=${(l:6::0:)${${REPLY##*/}%%.*}}$(zstat -F '%s' +mtime -- $REPLY)

und dann können Sie Verzeichnispfade verwenden, z. B.

print -rl some/place/else/*(o+prefixmtime)

Linux
  1. So verwenden Sie wget, um Dateien über Proxy herunterzuladen

  2. Wie finde ich heraus, aus welchem ​​Ordner ein Prozess läuft?

  3. unix:///var/run/supervisor.sock keine solche Datei

  4. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

  5. echo oder print /dev/stdin /dev/stdout /dev/stderr

Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

Linux – Zusammenführen von /usr/bin und /usr/sbin in /bin (gnu/linux)?

/proc/cpuinfo- und /proc/meminfo-Dateien unter Linux

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

So ändern Sie das Standard-/tmp in /home/user/tmp

Wie erstelle ich in meiner Datei /etc/hosts/ unter Linux/OSX eine Wildcard-Subdomain?