Tworzę listę wszystkich plików na moim komputerze.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
Wynik powinien wyglądać następująco:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Mój komputer wyświetla błąd
find: -printf: unknown primary or operator
Jakieś rozwiązania?
Komentarze
Odpowiedź
Opcji -printf
nie ma w POSIX
find
. Jest to funkcja GNU find
, np. W Linuksie.
Konkretna implementacja używasz, nie jest wyświetlany; może to być POSIX bez rozszerzeń. Na przykład nie ma go w FreeBSD ani OSX .
Bez tego możesz użyć jakiejś alternatywy, np. This (która nie będzie obsługiwać osadzonych pustych miejsc itp., Ale przyjmuje kilka założeń na temat twoich narzędzi):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Mając więcej informacji o dostępnych narzędziach, możliwe jest (zazwyczaj) ulepszenie rozwiązania.
Komentarze
- Proszę i jak mogę lista z danymi wyjściowymi " rozmiar_pliku / nazwa_pliku " jak powyżej?
- po co analizować
ls
kiedy znacznie lepiej byłoby użyćfind ... -print0
i przelać doxargs -0r stat ...
? Wersje GNU i FreeBSDstat
mają (niestety inne / niekompatybilne) opcje formatowania danych wyjściowych i mogą wyświetlaćsize/filename
zgodnie z wymaganiami OP . - OP nie podał żadnych informacji, które pozwalałyby założyć rozwiązanie specyficzne dla platformy.
Odpowiedź
find
i xargs
z GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Ta wersja GNU nie jest naprawdę potrzebna do tego konkretnego pytania, ponieważ GNU find
obsługuje printf
w każdym razie (ale może być przydatne w innych kontekstach, ponieważ istnieją rzeczy, które stat
mogą znaleźć o pliku, który find ... -printf
nie można wyświetlić).
FreeBSD & Mac OS X to jednak inna historia.
find
i xargs
z FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Opcjonalnie potokiem wyjście przez sed -e "s:/./:/:"
, aby usunąć ./
na początku każdej nazwy pliku.
Przykładowe dane wyjściowe z mojej testowej maszyny wirtualnej FreeBSD:
# 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
find
jest używana?