Найти не работает в скрипте, работает в терминале

Я пытаюсь запустить скрипт bash в Linux (ubuntu, но также и в fedora), но команда find не работает.

search=\"*${exten[iterext]}\"
find $direc{iterdir} $r_option -iname $search exec -rm {} \\\;

Теперь поясним переменные: Exten — это массив с расширениями файлов, считанными из текстового файла (здесь нет проблем); direc также является массивом каталогов, считанных из командной строки. Iterdir и iterext — целочисленные циклические переменные.

Теперь у меня две проблемы:

1- Эта команда поиска не будет удалена или отображена, если я запущу ее внутри скрипта; однако, если я поставлю эхо перед поиском и скопирую вывод в командную строку, поиск работает нормально. Я пробовал скрипт под Ubuntu и Fedora, поэтому я предполагаю, что это не проблема конфигурации bash. Я должен отметить, что проблема связана с $search, поскольку я заменил $search на жестко закодированную строку (например, «* txt»), и она работает внутри скрипта, поэтому, похоже, это проблема с кавычками.

2 - я запускаю всю эту команду find, а также получаю аргумент find:missing для '-exec'

Пожалуйста, помогите :-( это сводит меня с ума.


person PTGuy    schedule 10.03.2011    source источник


Ответы (2)


Начните с простого, поместив все в команду find, а затем беспокойтесь о ее параметрировании.

  1. ${exten[iterext]} должно быть ${exten[$iterext]}
  2. $direc{iterdir} должно быть ${direc[$iterdir]}
  3. exec -rm должно быть -exec rm
  4. \\\; должно быть \;
  5. Заключите переменные в кавычки, чтобы предотвратить разделение слов

Следующее будет выполнять пробный запуск благодаря файлу echo. Просто удалите echo, когда вас устроит вывод, чтобы выполнить удаление.

find "${direc[$iterdir]}" "$r_option" -name "*${exten[$iterext]}" -exec echo rm {} \;
person SiegeX    schedule 10.03.2011
comment
@PTGuy: NP, добро пожаловать в StackOverflow и не забудьте принять ответ, нажав на галочку. - person SiegeX; 11.03.2011
comment
Готово :-) Кавычки в bash могут быть немного пугающими. Да, я не правильно скопировал код (написал от руки, потому что я работаю внутри виртуальной машины) Но это все равно было неправильно, так что... Спасибо обоим за помощь. - person PTGuy; 11.03.2011
comment
Знаки доллара не нужны для индексов массива. - person Dennis Williamson; 11.03.2011
comment
Спасибо @Dennis, я когда-то знал этот факт, но с тех пор забыл. - person SiegeX; 11.03.2011

Ваше использование кавычек кажется мне немного странным. Попробуй это:

find "$direc{iterdir}" $r_option -iname "*${exten[iterext]}" -exec -rm "{}" ";"

О, и запустите сценарий оболочки с параметром -x. Это будет печатать каждую командную строку перед ее выполнением.

set -x
find "$direc{iterdir}" $r_option -iname "*${exten[iterext]}" -exec -rm "{}" ";"
set +x
person Roland Illig    schedule 10.03.2011
comment
С его командой много проблем, а не только кавычки, смотрите список в моем ответе. - person SiegeX; 10.03.2011
comment
Да, прочитав ваш ответ, я заметил это. До сих пор я не использовал переменные массива, поэтому не заметил этой ошибки. - person Roland Illig; 11.03.2011