Jeffrey Cross
Jeffrey Cross

Робота з великою кількістю файлів в Unix

У більшості випадків ви можете перемістити групу файлів з однієї папки в іншу, запустивши просту команду mv, наприклад “mv sourcedir / * destdir /“. Проблема полягає в тому, що коли ця зірочка розширюється, кожен файл у каталозі додається як параметр командного рядка до команди mv. Якщо sourcedir містить багато файлів, це може переповнювати буфер командного рядка, в результаті чого виникає таємнича помилка «Занадто багато аргументів».

Нещодавно я зіткнувся з цією проблемою, намагаючись керувати каталогом, у якому було більше мільйона файлів. Це не кожен день, коли ви стикаєтеся до каталогу, який містить метричні файли, але коли виникає проблема, існує простий спосіб боротися з нею. Хитрість полягає в тому, щоб скористатися зручною програмою xargs, яка розроблена для того, щоб взяти великий список як stdin і розділити її як аргументи іншої команди:

знайти sourcedir -тип f -print | xargs -l1 -i mv {} destdir /

-L1 повідомляє xargs використовувати лише один аргумент на час, щоб перейти до mv. Параметр -i вказує xargs замінити {} на аргумент. Ця команда виконає mv для кожного файлу в каталозі. В ідеалі, ви б оптимізували це і вказували щось на зразок -l50, посилаючи mv 50 файлів одночасно для переміщення. Саме так я пам'ятаю, як xargs працював на інших системах Unix, але GNU xargs, який я маю на моєму Linux-блоці, змушує кількість аргументів до 1 будь-коли викликати -i. У будь-якому випадку, це робить роботу.

Без -i параметр -l буде працювати в Linux, але ви не зможете використовувати заміну {}, і всі параметри розміщуються як кінцеві аргументи в команді. Це марно, коли ви хочете додати остаточний параметр, такий як каталог призначення для команди mv. З іншого боку, це корисно для команд, які закінчуються параметрами файлу, наприклад, коли ви видаляєте файли за допомогою команди rm.

Як не дивно, в OS X параметри для xargs трохи хиткий і капіталізований. Доброю новиною є те, що ви можете викликати заміну параметрів з кількома аргументами за один раз. Щоб перемістити купу файлів в OS X, 50 файлів одночасно, спробуйте наступне:

знайти sourcedir -тип f -print | xargs -L50 -I {} mv {} destdir /

Це майже все, що є. Це лише основний приклад, але як тільки ви звикнетеся використовувати xargs і знаходити разом, досить легко налаштувати параметри пошуку та перемістити файли на основі їхньої дати, дозволів або розширення файлу.

Поділитися

Залишити Коментар