使用する小さなgawkスクリプトを実行しようとしていますsystem()
。ファイルのリストを取得し、find
次のようにスクリプトを実行したいと思います。
find <arguments> -printf "%f\n" | script.awk
問題は、これらのファイルにスペース、引用符、角かっこなどの特殊文字が含まれていることです。たとえば、
$ ls
'Aujourd'\''hui C'\''est Toi (Orchestral).flac'
私は次のような様々な参考資料を試しました。
system("<command> \""$0"\"")
これ:
system("<command> \'"$0"\'")
あらゆる種類のエラーが発生します。一部は でsh -c
、 一部はgawk
... で発生します。
$0
これらの問題に直面せずに、gawkスクリプトのレコードやその他の変数をシェルコマンドに渡す方法はありますか?
メモ:一時的にファイル名を変更する方が簡単かもしれませんが、これを避けるのは難しいことがわかりました。
編集する:
提案された答えのどれも私の問題を解決しないので、問題のより具体的な説明は次のとおりです。以下を使用してコマンドを実行しようとします。2奇妙な変数。例:
私が実行した場合:
system("metaflac --show-tag=ARTIST \""FILE"\"")
引用したためエラーが発生せず、FILE
二重引用符が含まれていないため、すべてがうまく機能します。
しかし、私が実行した場合:
system("metaflac --set-tag=ARTIST="AWK_VAR_WITH_ARTIST_VALUE" "\"FILE\")
参照してもmetaflac
flacファイルが見つからないとエラーが表示されます。エラーメッセージを読み取ると、ファイル名が別々の単語で区切られていることがわかります。
ベストアンサー1
system("<command> \"$0\"")
これをプロセスに書き込むawkの機能に置き換えることができますprint $0 | "pre;<command> \"$v\""
。今後部分はstdinをシェル変数vとして読み込みます。 Bashでは次のようになりますread -r v
。
awk 'BEGIN{ cmd="read -r v; ls -ld \"$v\"" }
{ print $0 | cmd; close(cmd); }'
ファイル名の改行などの恐ろしいことを処理するには、findでprint0パスを使用するか、awkがそれを許可する場合はRS='\0'
bashを使用できます。
find . -print0 |
awk -v RS='\0' '
BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" }
{ print $0 "\x00" | cmd; close(cmd); }'