-Cを介してdirに変更しましたが、tarが絶対パスを使用するのはなぜですか?

-Cを介してdirに変更しましたが、tarが絶対パスを使用するのはなぜですか?

これがある:

$ls $des/bin
a.c           analysis.hpp  classify.hpp  main.cpp   split.hpp
a.cpp         a.out         grade.cpp     main.out   student.cpp
analysis.cpp  classify.cpp  grade.hpp     split.cpp  student.hpp
$ for i in $des/bin/*{hpp,cpp}; do echo $i; done | tar czvf files.tar.gz -C $des/bin -T -

/home/user/Desktop/bin/analysis.hpp
/home/user/Desktop/bin/classify.hpp
/home/user/Desktop/bin/grade.hpp
/home/user/Desktop/bin/split.hpp
/home/user/Desktop/bin/student.hpp
/home/user/Desktop/bin/a.cpp
/home/user/Desktop/bin/analysis.cpp
/home/user/Desktop/bin/classify.cpp
/home/user/Desktop/bin/grade.cpp
/home/user/Desktop/bin/main.cpp
/home/user/Desktop/bin/split.cpp
/home/user/Desktop/bin/student.cpp

今 - >それにもかかわらず、変更dirには$des/binまだルートから始まる絶対パスがありますが、提供する必要があります。比較的現在のディレクトリ(背面$des/bin-Cから始まるパス、なぜですか?

答え1

$desContainsなので、/home/user/Desktop転送したいファイルのリストは次tar -T -のとおりです。

/home/user/Desktop/bin/analysis.hpp
/home/user/Desktop/bin/classify.hpp
/home/user/Desktop/bin/grade.hpp
[...]

リストは次のようになります。

analysis.hpp
classify.hpp
grade.hpp
[...]

これがアーカイブに保存したいパスの場合。

通常、次のことを行います。

(
  cd -P -- "$des/bin" &&
    printf '%s\0' *.[hc]pp |
      tar --null -T - -zcvf -
) > file.tar.gz

(GNUtarまたは互換仮定)。

ファイルリストが十分に小さい場合は必要ありませんprintf。次のようにできます。

(
  cd -P -- "$des/bin" &&
    tar -czvf - -- *.[hc]pp
) > file.tar.gz

または、最も短い形式で要約すると、次のようになります。

(cd -P -- "$des/bin"&&tar czvf - -- *.[hc]pp)>file.tar.gz

ファイル数が非常に多い場合は、*.[hc]ppcmdline + environシステムコールが使用できる最大サイズを超える可能性がありますexecve()。組み込み関数はシステムコールを介して実行されないため、この制限の影響を受けないため、printfシェルでprintf組み込み関数を使用するとbashこの問題を解決できます。execve()

答え2

GNU tarのみ

tar --transform "s,.*/\(.*\),$des/bin/\1," -czf ~/files.tar.gz "$des"/bin/*.[ch]pp

あなたが探しているものかもしれません。 (最初のものは$des/bin/あなたが好きなものに置き換えることができ、\1ファイル名を表します。)

tar --transform 's,.*/\(.*\),\1,' -czf ~/files.tar.gz "$des"/bin/*.[ch]pp

関連情報