
Я использую 2 машины, которые обеRed Hat Enterprise Linux AS, выпуск 3 (обновление Taroon 2) (Я проверяю это в /etc/*-release).
Я проверил, что они используют одну и ту же оболочку по умолчанию ps -p $$
, а именно bash.
Я попытался выполнить команду поиска с подстановочным шаблоном: find path -name pattern -type f -ctime +3
и шаблон содержит символ * в качестве подстановочного знака.
Первая машина, похоже, расширила подстановочный символ и вызвала ошибку:
find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression
и мне нужно либо сделать шаблон между двумя разделенными кавычками, например: \"sftp_bcs_report_*.log\"
или использовать set -f
в скрипте для подавления расширения подстановочных знаков.
В другой машине такой проблемы нет. Есть идеи?
решение1
По умолчанию оболочки расширяют подстановочные знаки, если файл соответствует им, но не расширяют их без соответствия. Например, если вы запустите touch /tmp/111; touch /tmp/11*
это, то создадите и обновите mtime на /tmp/111, но если /tmp пуст, но вы вызовете, touch /tmp/11*
то получите файл с именем "11*" в /tmp.
Это довольно странная особенность оболочек. Иногда правильное расширение невозможно без специальных хаков в качестве промежуточной функции. Большинство современных оболочек изобретают специальные опции для типичных случаев; например, "shopt -s failglob" в bash отклоняет запуск любой команды, где не удается выполнить подстановочное совпадение.
Следует полагаться на расширение подстановочных знаков find, поэтому такой шаблон должен быть заключен в кавычки при расширении в оболочке:
find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7
(обратите внимание на одинарные кавычки). С одним или нулевым файлом это работает, но с двумя или более файлами вы получаете нарушенный синтаксис команды, и он жалуется - вот что сказал коллегаАрсеж. Ваш "set -f" полностью отключает расширение - ну, это хорошая мера для диагностики, но может дать подводные грабли для будущего перемещения. Цитаты проще:)
решение2
Похоже, что в начальном каталоге на второй машине нет соответствующего файла sftp_bcs_report_*.log
, а на первом сервере таких файлов больше одного. Для использования find
шаблоны всегда следует заключать в кавычки.