find: пути должны предшествовать выражению: \ +14 - PullRequest
0 голосов
/ 14 июня 2019

Это ошибка, которую я получаю

+ find /data/ing/ur/test -type f -iname -mtime '\+14' -exec mv '{}' /dm/Removed/$Removed_files ';'
find: paths must precede expression: \+14
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Мой .sh код

export Removed_files=rmvfolder
export _searchStr="abc_*"
export _input_date='-mtime \+14'
mkdir -m777 /dm/Removed/$Removed_files
find /data/ing/ur/test -type f -iname $_searchSt $_input_date  -exec mv {} /dm/Removed/$Removed_files \;

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Вы просите find найти файлы, чье имя совпадает (в случае нечувствительного к регистру совпадения) со строкой -mtime, а затем передаёт строку \+14 в качестве аргумента, который находит, интерпретирует как путь. Это говорит вам, что путь должен быть указан первым. Проблема в том, что _searchSt не установлено. (Вы установили переменную с именем _searchStr ранее, поэтому, вероятно, это опечатка.)

Обратите внимание, что этой проблемы можно было бы избежать, если бы вы использовали двойные кавычки и написали find /data/ing/ur/test -type f -iname "$_searchSt" $_input_date .... И это является предметом дискуссии относительно наилучшей практики: вы не можете двойные кавычки $_input_date, так как вы полагаетесь на разделение полей здесь. Лучше всего избегать использования разделения поля и явной записи -mtime с переменной, содержащей только аргумент, который будет использоваться. То есть; find "$path" -type f -iname "$searchStr" -mtime "$_input_date" ...

Вы также можете защититься от ошибок этого типа (неправильного использования имен переменных), используя конструкцию ${..?} и записывая find "${path?}" -type f -iname "${searchSt?}" ....

0 голосов
/ 14 июня 2019

Вы возитесь с расширением подстановочного знака оболочки, которое расширит выражение на все совпадающие имена файлов в данной папке, передав таким образом несколько имен файлов для поиска, до find сразу.Кроме того, я думаю, что вы неправильно используете директиву export (не так ли?).Вы должны изменить свой код следующим образом:

Removed_files=rmvfolder
_searchStr='abc_*' # Single quotes are needed here to prevent bash from expanding the wildcard!
_input_date='-mtime +14'
mkdir -m777 /dm/Removed/${Removed_files}
find /data/ing/ur/test -type f -iname ${_searchStr} ${_input_date}  -exec mv {} /dm/Removed/${Removed_files} \;

В качестве альтернативы, вы можете избежать звездочки;_searchStr=abc_\*

...