знайти порядок сортування за замовчуванням команди


30

який порядок сортування за замовчуванням для записів, повернених командою linux find?

Наприклад, якщо я видаю

find . -type f -name '*mp3' 

а вихід складається з декількох файлів у кількох підпапках, який порядок за замовчуванням, у якому вказані каталоги? У той же час, який порядок сортування, в якому перераховані файли в окремому каталозі?

Іноді вона повертається:

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

Подивіться, як спочатку перераховано вміст каталогу B, потім вміст каталогу A. Одночасно в каталозі A файли перераховані в смішному порядку.


З досвіду, здається, це відповідає послідовності за встановлення, тобто. якщо у вас однаковий набір файлів на двох машинах, він завжди поверне одне замовлення на одній машині, а зовсім інше - на іншому. Я задався питанням, чому раніше, +1
Джеймс Л

1
У мене в машині FM-передавач, і він завжди відтворює пісні з моєї флеш-карти в дивному порядку. Я ніколи цього не розумів, але я визнав, що саме той самий порядок, коли вищезазначена команда повертає свій результат
Nasko

BTW: BSD find має -sпараметр для алфавітного сортування виводу.
lapo

Відповіді:


19

findбуде проходити через дерево каталогів, коли елементи замовлення зберігаються у записах каталогу. Це (в основному) буде послідовно від запуску до запуску на одній машині і по суті буде "порядком створення файлів / директорій", якщо не було видалених.

Однак деякі файлові системи будуть переупорядковувати записи каталогів у рамках операцій ущільнення або коли розмір запису потрібно збільшувати, тому завжди є невеликий шанс, що "сирий" порядок зміниться з часом. Якщо ви хочете послідовно виконувати порядок, подайте висновок через додатковий етап сортування.


Дякуємо за детальну відповідь! Отже, якщо мій FM-передавач (див. Мій попередній коментар) відтворює треки в тому порядку, в якому команда find перелічить їх, я не в змозі контролювати, в якому порядку я б хотів, щоб вони відтворювалися.
Насько

Добре, що на флеш-картці, мабуть, використовується файлова система FAT, і якщо я добре пам’ятаю, маніпулювати порядком записів FAT досить легко з налагоджувачем файлової системи. Можливо, варто скопіювати пісні з поточного спалаху на новий спалах у тому порядку, у якому ви хочете, щоб вони відтворювалися, що може бути простіше.
Ватін

Одне з корисних застосувань такої послідовності - це оцінка прогресу повільного find /path/ -exec ...запуску набагато швидше, find /path/щоб спочатку отримати відсортований список файлів.
Андрій


2

Я працюю в UNIX / Linux з 1984/1991 відповідно, і була знайдена перша команда, яку я навчав. Linux / GNU помістила майже все, що вам потрібно, в поточну команду find, тому пограйте з нею.

Ось кілька корисних порад щодо сортування результатів пошуку. Опція -printf надає безліч варіантів, щоб увімкнути більш складне сортування та подання інформації про файли. Це найкраще для подібних проблем. Пограйте з ним, щоб побачити, що буде працювати для вас. Використовуючи -printf, ви можете налаштувати та розмежувати результати так, як вам потрібно. Це дуже допомагає, коли вам потрібно опублікувати обробку результатів. Я сподіваюся, що це комусь допоможе.

  1. Якщо ви використовуєте -ls і хочете сортувати за назвою файла, 11-е поле - це ім'я файлу, тож ви можете зробити наступне. Параметр сортування -k також може приймати кілька полів для сортування.

    знайти / шлях -ls | сортувати -k11

  2. Якщо ви хочете більш детально контролювати зерна за датою / часом у порядку зростання чи зменшення, використовуйте опцію -printf "". Детальніше дивіться в посібнику, але нижче наведено приклад, який буде надруковано дробовими секундами, тому він дуже точний.

ПРИКЛАД ДАТИ / ЧАС: 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

Ще один спосіб зробити це без символів у рядку дати / часу.

ПРИКЛАД ДАТИ / ЧАС: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.