Jeśli masz wersję GNU find, spróbuj tego:
find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}'
Aby skorzystać z tych nazw plików w pętli, czy
find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do
# use $file
done
drukuje polecenia znajdują się trzy rzeczy dla każdego pliku: (1) jego katalog, (2) jego głębokość w drzewie katalogów oraz (3) jego pełna nazwa. Uwzględniając głębokość na wyjściu, możemy użyć sort -n
do sortowania test/file
powyżej test/a/file
. Wreszcie używamy awk
, aby usunąć dwie pierwsze kolumny, ponieważ były używane tylko do sortowania.
Użycie jako separatora między trzema polami pozwala nam obsługiwać nazwy plików ze spacjami i tabulatorami (ale nie nowymi liniami, niestety).
$ find test -type f
test/b/file
test/a/file
test/file
test/z/file
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}'
test/file
test/a/file
test/b/file
test/z/file
Jeśli nie jesteś w stanie modyfikować komendę find
, a następnie spróbuj to zawiłe Zamiennik:
find test -type f | while read file; do
printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc/<<< "$file")" "$file"
done | sort -t '\0' | awk -F'\0' '{print $3}'
To nie to samo, z ${file%/*}
jest używany, aby uzyskać nazwę katalogu plik i komendy tr
używane do policzenia liczby ukośników, co jest odpowiednikiem "głębokości" pliku.
(Mam nadzieję, że jest łatwiejszy odpowiedź tam. Co pytasz nie wydaje się trudne, ale jestem wygaszania na proste rozwiązanie.)
Używam tego polecenia jako części mojego skryptu bash. Najchętniej miałam nadzieję, że mógłbym zrobić coś na wzór: "za plik w find ... | sort ... ' – Ken
@Ken Zobacz moją zmianę. 'znajdź ... | podczas odczytu plik 'powinien być preferowany zamiast' dla pliku w $ (find ...) '. Ta ostatnia nie jest bezpieczna, wolniejsza i może się nie powieść, jeśli w wierszu poleceń jest zbyt wiele nazw plików. –