Иногда мне приходится перебирать все файлы в каталоге, чтобы найти что-то, и для этого обычно будет работать обычный 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
Но это не чувствует себя хорошо, и поэтому гораздо больше кода, чем первый вариант. Может ли кто-нибудь сказать мне правильный способ выполнить первый цикл?
Спасибо!
Хм .. это именно то, что говорит документация, но по терминалу говорит «0403-057 Ошибка синтаксиса:» («не ожидается». Это должно работать в ksh93 правильно? (Я запускаю AIX-бокс) – filippo
Gosh darn it .. Я, возможно, почувствовал эту проблему с старой версией: https://bugzilla.redhat.com/show_bug.cgi?id=572024 для администратора sys! – filippo