当我尝试传递参数来查找命令时出现问题?

当我尝试传递参数来查找命令时出现问题?

范围:

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] 周围的 " 并在变量赋值中的每个星号之前添加一个或两个反斜杠。

相关内容