2013-01-23 7 views
5

Mam listę katalogów na podstawie wyników działania polecenia "znajdź" w bash. Jako przykład, wynik znaleziska są pliki:Sposób sortowania wyników wyszukiwania (w tym katalogów zagnieżdżonych) alfabetycznie w bash

test/a/file 
test/b/file 
test/file 
test/z/file 

Chcę uporządkować wyjście więc wydaje się jako:

test/file 
test/a/file 
test/b/file 
test/z/file 

Czy istnieje jakiś sposób, aby posortować wyniki w poleceniu find, lub przez potokowanie wyników w sortowanie?

Odpowiedz

9

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.)

+1

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

+0

@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. –

-1

spróbować. dla odniesienia, najpierw sortuje na drugim polu drugi znak. która istnieje tylko w pliku i ma wartość r dla odwrotnej, co oznacza, że ​​jest pierwsza, po czym sortuje się na pierwszym znaku drugiego pola. [-t jest deliminator pole, -k jest kluczem]

find test -name file |sort -t'/' -k2.2r -k2.1 

zrobić info sort aby uzyskać więcej informacji. istnieje mnóstwo różnych sposobów użycia -t i -k razem, aby uzyskać różne wyniki.

+0

To jest bardzo specyficzny i kludy sposób sortowania przykładowych nazw plików. To nie jest ogólne rozwiązanie. –

Powiązane problemy