[unix shell] работа с большим количеством файлов из ком. строки

Landstreicher

Есть каталог, в нем лежит большое количество (порядка 103 тысяч) файлов. Имена файлов имеют вид prefix_number.png, где prefix — тип файла, number — порядковый номер.
Нужно выполнять с этими файлами типичные действия, например удалить, переименовать, переместить в другое место, запаковать. Подмножество файлов хорошо выделяется с помощью регэкспов, например, 'ab*.png'
Если делать стандартными утилитами — выводится ошибка:

$ ls ab*.png
bash: /bin/ls: Argument list too long
$ mv ab*.png another_directory
bash: /bin/mv: Argument list too long
$ tar cvf ab.tar ab*.png
bash: /bin/tar: Argument list too long

В принципе, ошибка вполне понятна — существует ограничение на количество аргументов командной строки порядка 32768 или 65536.
Конечно, можно делать через find или xargs, например:
$ find -name 'ab*.png' -exec ls {} ';'
Но это медленно, так как на каждый файл делается fork + exec + масса других ненужных действий вроде инициализации /bin/ls.
Как сделать так, чтобы избежать этих накладных расходов?
Интересует, в первую очередь, что рекомендует делать в таких случаях true unix way.

Marinavo_0507

в true unix столько файлов на магнитный барабан или что там было не вмещалось
частично спасёт xargs
в tar есть --include
ещё есть ls -b *.png | while read FILE ; do

BondarAndrey

true unix велит пользоваться find и xargs.
Можно попробовать записать список файлов в файл и использовать awk

AlexV769

ещё есть ls -b *.png | while read FILE ; do
есть подозрение, что * не развернется.

sergey_m

Я бы делал на perl цикл с readdir.

Marinavo_0507

да, наебался
надо ls | grep
Оставить комментарий
Имя или ник:
Комментарий: