查找:路径必须在表达式之前:\ +14

时间:2019-06-14 11:04:58

标签: bash find sh

这是我遇到的错误

+ 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 :(得分:0)

您搞砸了Shell的通配符扩展,该扩展会将扩展扩展到给定文件夹中的所有匹配文件名,从而一次传递多个文件名以搜索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_\*

答案 1 :(得分:0)

您要查找文件以匹配名称(不区分大小写)字符串-mtime的文件,然后将字符串\+14传递为find解释为路径的参数。它告诉您必须首先给出路径。问题是_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?}" ...来防止此类错误(滥用变量名)。