堅牢なソリューションとして、find
を使用してください ファイル名をヌル文字で区切り、直接 tar
にパイプします 、null で区切られた入力を読み取ります:
find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -
これですべてが処理されます ファイル名が正しく、ファイル数による制限もありません。
ls
の使用 別のプログラムによって解析されるファイル名のリストを生成することは、可能な限り避けるべき一般的なアンチパターンです。 find
null 区切りの出力を生成できます (-print0
)ほとんどのユーティリティがさらに読み取りまたは解析できます。 null 文字はファイル名に表示できない唯一の文字であるため (および /
、明らかに)、これでいつでも安全です。
いいえ、圧縮された tar ファイルを解凍せずに追加することはできません。
ただし、tar はファイルから処理するファイルのリストを受け入れることができるため、次のようにするだけです:
ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt
@slhck は、ファイル名にスペース (およびおそらく他の厄介な文字) がある場合、上記の解決策が機能しないことを指摘しています。このバージョンでは、各ファイル名を二重引用符で囲みます:
ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt
(もちろん、ファイル名に二重引用符が含まれている場合、これは壊れます。その場合、当然の結果が得られます。:)