sed は、必要なすべての bash エスケープをファイルパスに挿入します。

sed は、必要なすべての bash エスケープをファイルパスに挿入します。

sed人間が読み取ることができるファイルまたはディレクトリパス(標準の端末に表示されるか出力に表示される)をbash引数*として使用できるコマンドに変更するコマンドを探しています。findたとえば、文字My Books/Pride & Prejudice.pdf列をMy\ Books/Pride\ \&\ Prejudice.pdf

\現在はVeryまたはspaceの前にスペースを挿入していますが&、さまざまな極端な場合にこのようなことが発生すると思います。だから、もっと一般的な解決策があるのだろうか。

*この問題の最も一般的なバージョンはおそらく不可能です。任意のプログラムが処理する引数にパスを渡す場合(たとえば、追加のsed操作)、各プログラムに異なるエスケープモデルが必要になる場合があります。しかし、私は出力をパスとして直接使用したいと思います。たとえば、cdそこに行くか呼び出すのと同じですcat

答え1

printf '%q\n' 'My Books/Pride & Prejudice.pdf'希望の結果が得られます。たとえば、glob モードを使用してprintf '%q\n' *複数のファイルの結果を取得できます。

ユースケースに応じて、find+execエスケープなしで組み合わせを使用できます。たとえば、一致するファイル名がコマンドfind -type f -name '*.txt' -exec cat {} +に正しく渡されます。cat

あるいは、ファイル名に一重引用符や改行文字などの問題のある文字がない場合は、手動でファイル名を一重引用符で囲み、別のコマンドに渡すこともできます。たとえば、ls -l 'My Books/Pride & Prejudice.pdf'

関連情報