これがある:
$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
$des
Containsなので、/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]pp
cmdline + 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