1

我正在尝试使用以下内容查找文件,然后将第一个结果复制到 $dir 设置的目录中。当我不设置变量并使用绝对路径时它工作正常,但这不是我需要的。

这不起作用:

dir="/path/to/destination/";
mkdir "$dir";
locate -l 1 target_file.txt | awk '{print "cp " $1 $dir " "}' | sh

错误信息是:

awk: illegal field $(), name "dir"
 input record number 1, file 
 source line number 1
cp: fts_open: No such file or directory

这有效:

locate -l 1 target_file.txt | awk '{print "cp " $1 " /path/to/destination/"}' | sh
4

1 回答 1

1

awk脚本中,您不使用$前缀变量;您可以使用它来引用输入行中的字段。

dir="/path/to/destination/";
mkdir "$dir";
locate -l 1 target_file.txt | awk -v dir="$dir" '{print "cp",  $1, dir}' | sh

只要您的姓名中没有空格,这将正常工作。

dir="/path/to/destination/";
mkdir "$dir";
locate -l 1 target_file.txt | awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | sh

除非我搞砸了反斜杠,否则它应该与文件名中的空格等一起使用。如果有人不友好地将换行符放入文件名中,整个管道将被搞砸。

于 2012-12-19T00:37:25.103 回答