ドットファイルを含めるとtarエラーが発生する

ドットファイルを含めるとtarエラーが発生する

いくつかのファイルを圧縮する必要がありますが、その1つはドットファイルです。

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

変数置換はtar: Removing leading '/' from member names警告を防ぎ、解凍プロセスを簡素化します。

ただし、次のエラーが発生します。

tar: tmp/foo/.env tmp/foo/docker-compose.yml: 計算できません: そのファイルやディレクトリはありません。

ハードコーディングされたパスは有効ですtar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml

それでは、問題はドットファイルを処理することにありますか、それともエスケープに関連していますか?

ベストアンサー1

シェルが拡張されると、"$FILES"スペースは文法的価値を失います。したがって、コマンドはtar単一のパスで受信されます。tmp/foo/.env tmp/foo/docker-compose.yml

良い

file='a b'
touch "$file"

a b2つのファイルの代わりにファイルを生成しaますb

したがって、コメントで提案されているように、ファイルごとに異なる変数を使用する必要がありますtar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}"


直接実行すると機能する理由tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.ymlは、スペースにあるパラメータを他のパラメータと区別する構文値があるためです。 「人の目」には"$FILES"拡張時に同じ空間が作成されますが、tmp/foo/.env tmp/foo/docker-compose.ymlこの場合、空間は参照によって特別な意味を持たないため、値全体が単一パスと見なされます。

おすすめ記事