Циклический просмотр всех файлов, динамический пропуск некоторых

Все выглядит нормально, вам просто нужно передать catв цикл:

cat /ora/do.lst |  while read -r line
  do
   if [[ -z $line ]]
     then
       echo "The list is empty "
       exit
     else
      lst_no=${line},
      echo "${line} is processing now "
   fi
done

Очевидно, что это не оптимальный способ обработки строк, но я предполагаю, что это просто для обучения.


Чуть лучше было бы хотя бы избегать бесполезной catи ненужной трубы:

while read -r line; do
...
done </ora/do.lst

или даже лучше, чтобы сохранить стандартный ввод для команд внутри цикла:

while read -r line <&3; do
...
done 3</ora/do.lst

Однако, если в вашем файле много строк, вы можете рассмотреть возможность перезаписи сценария в awk, perlили другом инструменте, предназначенном для задачи обработки текста -. Циклы оболочки не оптимизированы в этом отношении.

0
15.04.2019, 05:41
1 ответ

Да, -execявляется предикатом, таким же, как и -name, и findбудет учитывать статус выхода команды и рассматривать его как ложный, если он не равен -нулю.

Но обратите внимание, что a)это относится только к форме -exec... \;, а не к форме -exec.. {} +(, которая всегда верна )и b)разветвление отдельного процесса для каждого файла или каталога медленно .

Например, будут пропущены все каталоги, содержащие файл с именемfoo.txt:

find. -type d -exec test -f {}/foo.txt \; -prune -or -print

$ mkdir -p a/{1,2,3}/{x,y,z}; touch a/{1,2,3}/{x,y,z}/a.txt
$ find. -type d -exec test -f {}/foo.txt \; -prune -or -print
... lots of files...
$ touch a/{1,2}/foo.txt a/3/{x,y}/foo.txt
$ find. -type d -exec test -f {}/foo.txt \; -prune -or -print
.
./a
./a/3
./a/3/z
./a/3/z/a.txt

Конечно, вместо статической команды test -f...можно использовать, например. path/to/some/script {}.... С GNU find (по умолчанию в Linux )вы можете использовать -execdirвместо -exec.

1
28.01.2020, 02:40

Теги

Похожие вопросы