范围:
export exc_lst='! -path "/var/app/s2/pnl/incoming/recondata/*.*"';
当我尝试使用以下查找命令时:
find $FILE_DIR -name "*.*" "${exc_lst}" -type f -mtime +20 -user sh79790 -ls
它抛出一个错误:缺少连词
find $FILE_DIR -name "*.*" ${exc_lst} -type f -mtime +20 -user sh79790 -ls
它不排除提到的路径。
当我直接传递值时,它工作正常,即
find $FILE_DIR -name "*.*" ! -path "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls
我需要解析变量,该变量将包含要从 find 命令中排除的所有文件。
答案1
您有引用问题。
提示:在命令行前面粘贴echo
可以查看它实际扩展的内容。更明确的是,为了准确显示每个参数的分隔位置,请粘贴python -c "import sys; print sys.argv[1:]"
在命令行前面。
python -c "import sys; print sys.argv[1:]" \
find $FILE_DIR -name "*.*" "${exc_lst}" -type f -mtime +20 -user sh79790 -ls
输出:
['find', '-name', '*.*', '! -path "/var/app/s2/pnl/incoming/recondata/*.*"', '-type', 'f', '-mtime', '+20', '-user', 'sh79790', '-ls']
正如您所看到的,! -path "/var/app/s2/pnl/incoming/recondata/*.*"
作为一个大参数提供,其中包含空格和引号。这就是您引用时所要求的${exc_lst}"
:不要扩展。find
不认识这一点。它需要!
、-path
和路径全部作为单独的参数。
现在:
echo find $FILE_DIR -name "*.*" ${exc_lst} -type f -mtime +20 -user sh79790 -ls
输出:
find -name *.* ! -path "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls
正如您所看到的,路径名周围有文字双引号字符。它将排除实际上包含这些引号的路径,这种情况不会发生。
尝试exc_lst
不使用这些引号进行定义:
export exc_lst='! -path /var/app/s2/pnl/incoming/recondata/*.*'
然后使用第二种形式:
find $FILE_DIR -name "*.*" ${exc_lst} -type f -mtime +20 -user sh79790 -ls
幸运的是,要排除的路径不包含任何空格。如果是这样,你将很难实现这一点。
注意:我的所有示例输出都缺少第一个参数,因为find
在$FILE_DIR
我的 shell 中未定义(您尚未指定其值),但如果定义了它,它就会在那里。
答案2
您不能同时定义exec_lst
您所做的方式并防止 shell 扩展文件名。
-path
并且它的参数必须在单独的参数中
所以我建议直接在命令行中使用 `-path* 并且只将路径放入 shell 变量中。
另一种方法可能是省略 $[exed_lst] 周围的 " 并在变量赋值中的每个星号之前添加一个或两个反斜杠。