Найти не работает в скрипте, работает в терминальной строке - PullRequest
1 голос
/ 10 марта 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Начните с простого, поместив все в команду 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 {} \;
0 голосов
/ 10 марта 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
...