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'