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 に答える