2012-05-14 10 views
0

Иногда мне приходится перебирать все файлы в каталоге, чтобы найти что-то, и для этого обычно будет работать обычный for i in $(ls *.txt). Но бывают случаи, когда у вас слишком много файлов в папке, а for дает 0403-027 The parameter list is too long. (то есть for, diff, ls или что-то еще).Итерирование списка параметров, когда слишком много аргументов в KSH

Я нашел одно решение для этого, которое читает входные строки за строкой с помощью while read, но потом это сложная часть. Сначала я думал, что в идеале хотелось бы что-то вроде:

while read file ; do 
    # do something with file 
done < $(find . -type f -name *.txt) 

Но что возвращает одну строку, заполненную ^J в качестве разделителей (странно?) И, конечно, не будет такого файла. Изменение IFS до \n тоже не сработало.

Мой текущий обходной путь строит временный файл со всеми файлами меня интересуют, а затем, используя время:

tmpfile=$$.$(date +'%Y%m%d%k%M%S').tmp 
find . -type f -name *.txt > $tmpfile 
while read file ; do 
    # do something with file 
done < $tmpfile ; rm $tmpfile 

Но это не чувствует себя хорошо, и поэтому гораздо больше кода, чем первый вариант. Может ли кто-нибудь сказать мне правильный способ выполнить первый цикл?

Спасибо!

ответ

1

Вам нужно процесс замена, не команды замещения в этой ситуации:

while IFS= read -r file ; do 
    # do something with file 
done < <(find . -type f -name *.txt) 

замена <() процесса в основном действует как файл, который вы можете переадресовать в то время как петлю.

+0

Хм .. это именно то, что говорит документация, но по терминалу говорит «0403-057 Ошибка синтаксиса:» («не ожидается». Это должно работать в ksh93 правильно? (Я запускаю AIX-бокс) – filippo

+0

Gosh darn it .. Я, возможно, почувствовал эту проблему с старой версией: https://bugzilla.redhat.com/show_bug.cgi?id=572024 для администратора sys! – filippo

Смежные вопросы