Все выглядит нормально, вам просто нужно передать 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
или другом инструменте, предназначенном для задачи обработки текста -. Циклы оболочки не оптимизированы в этом отношении.
Да, -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
.