znajdź domyślną kolejność sortowania poleceń

30

jaka jest domyślna kolejność sortowania wpisów zwracanych przez polecenie linux find?

Na przykład jeśli wydam

find . -type f -name '*mp3' 

a dane wyjściowe składają się z wielu plików w wielu podfolderach, jaka jest domyślna kolejność wyświetlania katalogów? Jednocześnie, jaka jest kolejność sortowania, w jakiej znajdują się pliki w danym katalogu?

Czasami zwraca:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Zobacz, jak najpierw wyświetlana jest zawartość katalogu B, a następnie katalogu A. Jednocześnie w katalogu A pliki są wyświetlane w śmiesznej kolejności.

Nasko
źródło
Z doświadczenia wydaje się, że jest spójny na instalację, tj. jeśli masz ten sam zestaw plików na dwóch komputerach, zawsze zwróci jedno zamówienie na jednym komputerze, a zupełnie inne na drugim. Zastanawiałem się, dlaczego wcześniej, +1
James L
1
W samochodzie mam nadajnik FM i zawsze odtwarza utwory z mojej karty flash w dziwnej kolejności. Nigdy tego nie wymyśliłem, ale rozpoznałem, że jest dokładnie w takiej samej kolejności, w jakiej powyższe polecenie zwróciło wynik
Nasko
BTW: BSD find ma -sparametr do sortowania alfabetycznego wyników.
Lapo

Odpowiedzi:

19

findbędzie przemierzał drzewo katalogów w kolejności, w której pozycje są przechowywane w pozycjach katalogu. Będzie to (przeważnie) spójne od uruchomienia do uruchomienia na tym samym komputerze i będzie zasadniczo „kolejnością tworzenia plików / katalogów”, jeśli nie zostaną usunięte.

Jednak niektóre systemy plików ponownie zamawiają pozycje katalogu w ramach operacji zagęszczania lub gdy rozmiar pozycji wymaga rozszerzenia, więc zawsze istnieje niewielka szansa, że ​​kolejność „surowa” zmieni się z czasem. Jeśli chcesz uzyskać spójne zamówienie, przeprowadź wyjście przez dodatkowy etap sortowania.

Vatine
źródło
Dziękujemy za szczegółową odpowiedź! Tak więc, jeśli mój nadajnik FM (patrz mój poprzedni komentarz) odtwarza utwory w kolejności, w jakiej polecenie wyszukiwania je wyświetli, nie jestem w stanie kontrolować, w jakiej kolejności chciałbym je odtwarzać.
Nasko
Cóż, karta flash prawdopodobnie używa systemu plików FAT i jeśli dobrze pamiętam, manipulowanie kolejnością wpisów FAT jest całkiem łatwe z debuggerem systemu plików. Być może warto skopiować utwory z bieżącego flasha na nowy flash, w kolejności, w której chcesz je odtwarzać, może to być łatwiejsze.
Vatine
Jedną z przydatnych aplikacji o takiej spójności jest szacowanie postępu powolności find /path/ -exec ...z działaniem znacznie szybciej, find /path/aby najpierw posortować listę plików.
Andrey
6

Nie powinieneś polegać na konkretnej kolejności wyjściowej, finda zamiast tego powinieneś użyć sorti innych środków do konkretnej kontroli kolejności.

Wstrzymano do odwołania.
źródło
2

Pracuję w UNIX / Linux odpowiednio od 1984/1991 i pierwsze polecenie, którego się nauczyłem, to znajdź. Linux / GNU umieścił prawie wszystko, czego potrzebujesz w bieżącym poleceniu find, więc pobaw się nim.

Oto kilka pomocnych wskazówek dotyczących sortowania wyników wyszukiwania. Opcja -printf daje wiele opcji umożliwiających bardziej złożone sortowanie i prezentację informacji o pliku. Jest najlepszy w przypadku takich problemów. Zagraj z nim, aby zobaczyć, co będzie dla Ciebie odpowiednie. Korzystając z opcji -printf, możesz dostosowywać i ograniczać wyniki tak, jak chcesz. To bardzo pomaga, gdy trzeba opublikować wyniki. Mam nadzieję, że to komuś pomoże.

  1. Jeśli używasz -ls i chcesz sortować według nazwy pliku, 11. pole to nazwa pliku, dzięki czemu możesz wykonać następujące czynności. Opcja sort -k może również zajmować wiele pól.

    find / path -ls | sortuj -k11

  2. Jeśli chcesz dokładniej sortować ziarno według daty / godziny w porządku rosnącym lub malejącym, użyj opcji -printf „”. Więcej informacji znajduje się w instrukcji, ale poniżej znajduje się przykład, który zostanie wydrukowany z ułamkami sekund, dzięki czemu jest bardzo dokładny.

PRZYKŁAD DATA / CZAS: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Innym sposobem na to bez znaków w ciągu daty / godziny jest.

PRZYKŁADOWA DATA / CZAS: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
David Conger-Eldeen
źródło