Как выполнить команду find, используя набор строк из строки текстового файла

Нет, в может запускать только неинтерактивные сценарии.

Эти сценарии будут выполняться без подключения к терминалу, с которого вы запустили команду at . Если программа выводит что-то в своем потоке stdout и / или stderr , этот вывод будет отправлен вам по почте.

Некоторые переменные не сохраняются при запуске сценария, особенно DISPLAY , что является причиной неудачной попытки. Вы можете просмотреть свою почту, чтобы узнать, не сообщается ли об ошибке. В противном случае sendmail или аналогичный, вероятно, не установлен / не настроен.

Если вы хотите использовать текущий дисплей X11 при выполнении команды, вы можете установить его следующим образом:

echo "DISPLAY=$DISPLAY alarm.sh \"-i It's time to ring up the revenue service\"" | at 15:00
1
05.07.2017, 06:15
3 ответа

Наконец-то я нашел ответ. Мне просто нужно указать полный путь к файлу fnames.txt в /path/to/my/fnames.txt, потому что я выполняю скрипт в другом каталоге.

#!/bin/sh
#
#
while read -r LINE
do
    find -name "$LINE"
done < /path/to/my/fnames.txt

Выход:

./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat
./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat
0
27.01.2020, 23:18

Причина в порядке, в котором оболочка обрабатывает различные расширения и кавычки. Если вы наберете

напрямую
find. -name "foo*"

Оболочка удалит кавычки и передаст foo*в качестве параметра в find.

Без кавычек оболочка сначала выполнит подстановку для *, что потенциально может привести к множественным совпадениям, что приведет к путанице find. Поэтому разумно использовать кавычки.

Но если вы readвыберете строку из файла, переменная будет содержать кавычки. Теперь, когда вы это сделаете

> echo $LINE
"foo*"
> echo "foo*"
foo*
> find. -name $LINE

вы видите, что кавычки $LINEне будут удалены, в отличие от кавычек для echo "foo*". Это связано с тем, что оболочка сначала обрабатывает кавычки echo $LINE(, а )нет, а затем выполняет подстановку переменных, поэтому строка будет читаться как echo "foo*", но теперь кавычки остаются.

Итак, ваш findбудет искать файлы, содержащие кавычки. Решение состоит в том, чтобы оставить кавычки в файле. Там кавычки не нужны, вся строка будет идти в переменную.

3
27.01.2020, 23:18

Измените IFSна :

.
while IFS=\" read -r x LINE x; do
   find. -name "$LINE"
done < fnames.txt

Это **по существу удалит кавычки **, а $LINEбудет тем, что вам нужно findдля правильной работы. Что он делает, так это разделяет строку, прочитанную на кавычки, и поэтому они не будут отображаться в $LINE.

1
27.01.2020, 23:18

Теги

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