Bashスクリプトで奇妙な文字を正しくエスケープする方法は?

Bashスクリプトで奇妙な文字を正しくエスケープする方法は?

私はスクリプトを書いたりコマンドを探したりする専門家ではありません(単に警告です)。私はすべてのmp3 Podcastを自分の携帯電話に移動できるフォルダに移動するスクリプトを作成しようとしています。

そのため、私が作成したスクリプトはすべてのmp3(パスが奇妙なファイルも含む)を移動する必要があります。以下のようにスクリプトを作成しましたが、意図したとおりに動作しているようですが、引き続き次のエラーが発生します。

find /home/jason/gPodder/ -name '*.mp3' -exec bash " cp '{}' /home/jason/gPodder/mp3/ " \;
Which returns:    
bash:  cp '/home/jason/gPodder/Downloads/The Documentary/TheDocumentary20170823-GoingGreenInTheOilState.mp3' /home/jason/gPodder/mp3/ : No such file or directory 

しかし、上記のbash "コマンド"をコピーすると正常に動作します。スクリプトのエラーが何であるかを理解するのに役立ちます。

ありがとう

ベストアンサー1

〜のように@Kusalanandaが言った。-c、インラインスクリプトを使用する機能はありません。

{}しかし、それにもかかわらず、任意のコマンドインジェクションの脆弱性(例'$(reboot)'.mp3で呼び出されたファイル)になる可能性があるシェルコードには含めないでください。代わりに、インラインスクリプトのパラメータとして作成します(インラインスクリプトが実際に必要であると仮定し、これは単なるcp例です)。

find ... -exec sh -c 'cp "$1" /home/jason/gPodder/mp3' sh {} \;

bash(これだけのためにもする必要はありません。sh意図も大丈夫です。)

または、より良い方法は、一度に複数の引数を渡すことですcp

find ... -exec sh -c 'cp "$@" /home/jason/gPodder/mp3' sh {} +

GNUを使用すると、cp次のこともできます。

find ... -exec cp -t /home/jason/gPodder/mp3 {} +

おすすめ記事