У меня есть каталог с 2,5 миллионами файлов и более 70 ГБ.Разделить большой каталог в подкаталоги
Я хочу разбить это на подкаталоги, каждый из которых содержит 1000 файлов.
Вот команда, я попытался с помощью:
i=0; for f in *; do d=dir_$(printf %03d $((i/1000+1))); mkdir -p $d; mv "$f" $d; let i++; done
Эта команда работает для меня в небольшом масштабе, но я могу оставить ее работать в течение нескольких часов на этой директории, и это, кажется, не делать ничего ,
Я открыт для этого в любом случае с помощью командной строки: Perl, Python и т.д. Просто любой способ будет самым быстрым, чтобы это было сделано ...
Ваш '*' собирается потратить некоторое время на расширение. Возможно, начните с более целевого поднабора имени файла, такого как 'a *', и посмотрите, вернется ли он в более разумное время. Вы также можете использовать 'find' вместо for-loop. Также меня беспокоит создание подкаталогов в этом уже слишком большом каталоге. Рассматривали ли вы их создание в другом месте? – LinuxDisciple
Я бы порекомендовал обрабатывать результаты 'find'. –
Только очень хорошо написанные оболочки могут обрабатывать строки, полученные в результате команд или подстановочных расширений, которые находятся в диапазоне размеров нескольких МБ. Чтение каталога в программе происходит быстро и легко (см. @ikegami). - Если вы хотите использовать скрипт оболочки: разделите проблему, перебирая 'ls' в' while, пока читаете ... done', чтобы получить файлы по одному. – laune