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

  • Rozwiń pytanie, aby wyświetlić nazwy plików w Twoim katalogu.
  • A dokładniej, jaki typ systemu działa na komputerze i jaka wersja find jest używana?

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ć do xargs -0r stat ...? Wersje GNU i FreeBSD stat 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 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *