主な問題:
バックアップを実行するスクリプトを作成しています。以下のファイルリストを作成します。
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が仮定しPython
てTutorial.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」に引数として渡します。
find
2番目の質問:コマンドからファイル名を取得するには、printfを使用します。
find /path/to -printf '%f\n'
file.txt
単にfindではなく一般的な意味であればbasename
。
# basename /path/to/file.txt
file.txt
basename はまさにそのことだけを行うように設計されており、他のことは行いません。