Howto pipe: cp | смола | gzip без создания промежуточных файлов?


31

Может кто-нибудь сказать мне, если это возможно, чтобы труба | это без необходимости создавать физический файл где-нибудь между A и B.tar.gz?

Вот что я пытаюсь сделать:

  1. Файл А
  2. Переименовать в B
  3. Tar B.tar
  4. gzip -9 B.tar.gz

Так, например:

cp A B | tar cvf - B | gzip -9 B.tar.gz
gzip  pipe  tar 

зачем тебе трубку cp A B?
Дор

1
переименовать есть mv.
Кароли Хорват

3
Пожалуйста, объясните, почему вы хотите скопировать Aв Bпервую очередь.
спикер

Ответы:


42

Следующие примеры могут использоваться, чтобы избежать создания промежуточных файлов:

tar с gzip:

tar cf - A | gzip -9 > B.tar.gz

GZIP без смолы:

gzip -9c A > B.gz

tar без gzip:

tar cf B.tar A

Переименование (перемещение) Aв Bпервую очередь не имеет смысла для меня. Если это предназначено, то просто поставить mv A B &&перед тем любой из указанных выше команд и обмена Aс Bтам.

Пример с tar и gzip:

mv A B && tar cf - B | gzip -9 > B.tar.gz


1
Это правильно и должно быть помечено как таковое. Вы должны включить «-» после «tar» для переданного по конвейеру параметра, иначе вы получите «tar: трусливый отказ от создания пустого архива».
Adambean

6

Это зависит от вашей версии tar

Если у вас есть версия, которая поддерживает преобразования членов (--transform или --xform), вы можете просто сделать

tar -c --transform=s/A/B/ A | gzip -9 > B.tar.gz

| gzip -9> B.tar.gz можно избежать, если ваш tar поддерживает опцию -z

tar -zcvf B.tar.gz --transform=s/A/B/ A

Если ваша версия tar не поддерживает --transform, вам сначала нужно просто скопировать файл, например

 cp A B && tar -zcvf B.tar.gz B

Однако, если вы сжимаете только один файл, почему бы не пропустить часть tar все вместе и просто сделать

cat A | gzip -9 > B.gz

Я использовал cp, как вы сделали в своем примере, но переименуйте в mv

0

Если вы используете cpдля создания копии с другим именем / местоположением, просто включите полный / окончательный путь, который вы хотите при создании завершенного файла .gzip:

tar -cvf existing.file | gzip -1 > ./newdirectory/newnamed.file.tgz

Это не работает, выдает «tar: трусливый отказ от создания пустого архива».
Adambean

@ Adambean Может быть, вы хотите использовать tar -czf - some-folder > some-archive.tar.gz?
Цауэрвайн

1
@tsauerwein, да, смотрите мой ответ на ответ ниже от 14 месяцев назад ...
Adambean,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.