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 anxargs -0r stat ...
weiterzuleiten? Sowohl die GNU- als auch die FreeBSD-Version vonstat
verfügen über (leider unterschiedliche / inkompatible) Optionen zum Formatieren der Ausgabe und könnensize/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