必要に応じてバックスラッシュを含むファイルのリストを変数にどのように保存できますか?

必要に応じてバックスラッシュを含むファイルのリストを変数にどのように保存できますか?

主な問題:

バックアップを実行するスクリプトを作成しています。以下のファイルリストを作成します。

LISTOFFILES=$(find ~ \( -name '*.[pP][dD][fF]' -o -name '*.[oO][dD][tT]' \))

この変数はLISTOFFILESおおよそ次を格納します。

/home/user/file1.pdf /home/user/file2.odt /home/user/Python Tutorial.pdf

次のステップは次のとおりです。

tar cvf backup.tar $LISTOFFILES

Bashの応答は次のとおりです。

/home/user/file1.pdf
/home/user/file2.odt
/home/user/Python: Cannot stat: No such file or directory
tar: Tutorial.pdf

私はBashが仮定しPythonTutorial.pdf別のファイルであることを知っています。

バックスラッシュを含むファイルのリストを作成する方法はありますか?それともパイプで使用するようにfind変更する必要がありますか?ls

私はあなたのアドバイスとアドバイスを読みたいです。

私の他の質問:

この質問に対する答えは重要ではありませんが、ヒントが役に立つかもしれません。

ファイルパスではなくファイル名のみを含むファイルを一覧表示するにはどうすればよいですか?

例:file/home/user/file

find成功せずにコマンドpruneとオプションを試してみましたpath

ベストアンサー1

主な問題については別のアプローチを取る必要があります。あなたのアプローチは、すべてのファイルを$ LISTOFFILESの単一の文字列に入れることです。その後、アクセス時に引用符を使用しないため、スペースで区切られた結果が表示されます。

希望の結果を得るための最も簡単な方法は次のとおりです。

find ~ \( -name '*.[pP][dD][fF]' -o -name '*.[oO][dD][tT]' \) -print0 | xargs -0 tar cvf backup.tar

私たちがすることは find を実行し、各結果を NULL 文字 (-print0 部分) に分離するだけです。その後、findの出力はxargsにパイプされ、NULL文字で区切られたファイルのリストを読み取り(-0パラメーターはxargsにこれを行うように指示します)、ファイルのリストを「tar」に引数として渡します。

find2番目の質問:コマンドからファイル名を取得するには、printfを使用します。

find /path/to -printf '%f\n'
file.txt

単にfindではなく一般的な意味であればbasename

# basename /path/to/file.txt
file.txt

basename はまさにそのことだけを行うように設計されており、他のことは行いません。

おすすめ記事