Ich erstelle eine Liste aller Dateien auf meinem PC.

FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n) 

Die Ausgabe sollte sein:

"size/file_name" 56872/file.txt 98566/test 1000254/foo 

Mein PC gibt mir einen Fehler

find: -printf: unknown primary or operator 

Irgendwelche Lösungen?

Kommentare

  • Erweitern Sie die Frage, um die Dateinamen in Ihrem Verzeichnis anzuzeigen.
  • Genauer gesagt, welcher Systemtyp wird auf dem PC ausgeführt und welche Version von find wird verwendet?

Antwort

Die Option -printf befindet sich nicht in POSIX find . Dies ist eine Funktion von GNU find , z. B. unter Linux.

Die jeweilige Implementierung Sie verwenden wird nicht angezeigt; Es könnte POSIX ohne Erweiterungen sein. Zum Beispiel ist es nicht in FreeBSD oder OSX .

Ohne dies können Sie eine Alternative verwenden, z. B. diese (die keine eingebetteten Leerzeichen usw. verarbeitet, aber nur wenige Annahmen über Ihre Werkzeuge macht):

find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }" 

Mit weiteren Informationen zu den verfügbaren Tools ist es (normalerweise) möglich, die Lösung zu verbessern.

Kommentare

  • Bitte und wie kann ich dies tun? Liste mit Ausgabe " Dateigröße / Dateiname " wie oben?
  • Warum ls Wann wäre es viel besser, find ... -print0 zu verwenden und an xargs -0r stat ... weiterzuleiten? Sowohl die GNU- als auch die FreeBSD-Version von stat verfügen über (leider unterschiedliche / inkompatible) Optionen zum Formatieren der Ausgabe und können size/filename nach Bedarf des OP anzeigen .
  • OP lieferte keine Informationen, die es erlauben würden, eine bestimmte plattformspezifische Lösung anzunehmen.

Antwort

find und xargs mit GNU stat:

find . -type f -print0 | xargs -0r stat -c "%s/%n" 

Diese GNU-Version wird für diese spezielle Frage nicht wirklich benötigt, da GNU find printf trotzdem (aber es könnte in anderen Kontexten nützlich sein, weil es Dinge gibt, die stat über eine Datei herausfinden kann, die find ... -printf kann nicht angezeigt werden.

FreeBSD & Mac OS X ist jedoch eine andere Geschichte.

find und xargs mit FreeBSD ( Mac OS X) stat:

find . -type f -print0 | xargs -0r stat -f "%z/%N" 

Leitet die Ausgabe optional durch sed -e "s:/./:/:", um die ./ am Anfang jedes Dateinamens zu entfernen.

Beispielausgabe von meiner FreeBSD-Test-VM:

# find . -type f -print0 | xargs -0r stat -f "%z/%N" | sed -e "s:/./:/:" | head 149/.k5login 254/.profile 1169/.cshrc 297/.login 5589/.history 171/.ssh/known_hosts 1803/.ssh/authorized_keys 6699/.bash_history 368/.bashrc 4065/.viminfo 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.