Как передать вывод tar через mv?

Как передать вывод tar через mv?

Апредыдущий вопросмой спрашивал, как перенаправить загруженные файлы через tar, теперь я хотел бы узнать, как перенаправить вывод tar через mv. Смотрите, у меня сейчас есть эта команда:

wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz

и это создает каталог с именем moksha-0.1.0, но я хотел бы знать, как я могу переименовать этот выходной каталог в moksha, возможно, с помощью конвейера ( |) в конце этой команды. Хотя если вы знаете, как сделать это без конвейера, но все еще на той же строке кода, что и wget и tar, я буду рад принять это тоже.

Если говорить точнее, я знаю, что:

wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha

создаст выходной каталог moksha, но внутри этого выходного каталога будет каталог , moksha-0.1.0вместо того чтобы помещать его в новый каталог с именем .moksha-0.1.0mokshamoksha-0.1.0moksha

решение1

Так?

[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS       config.guess          debian                 Makefile.am
aclocal.m4      config.guess.dh-orig  depcomp                Makefile.in
AUTHORS         config.h.in           doc                    missing
autogen.sh      config.rpath          enlightenment.pc.in    netwm.txt
autom4te.cache  config.sub            enlightenment.spec.in  NEWS
BACKPORTS       config.sub.dh-orig    INSTALL                po
BUGS            configure             install-sh             README
ChangeLog       configure.ac          intl                   src
compile         COPYING               ltmain.sh              xdebug.sh
config          data                  m4                     x-ui.sh

Из tarстраницы руководства:

--преобразование=ВЫРАЖЕНИЕ, --xform=ВЫРАЖЕНИЕ
    Используйте sed для заменыВЫРАЖЕНИЕдля преобразования имен файлов.

Так что, sedвероятно, требуется для того, чтобы это работало. Хотя, если у вас есть wget, у вас, вероятно, sedтакже есть.

решение2

Примечание: Мой ответ на самом деле не о tar; это ответ конкретно на эту часть вашего вопроса:

...это создает каталог с именем moksha-0.1.0, но я хотел бы знать, как я могу переименовать этот выходной каталог в moksha, возможно, с помощью конвейера ( |) в конце этой команды. Хотя, если вы знаете, как сделать это без конвейера, но все еще на той же строке кода, что и wget и tar, я буду рад принять это тоже.

Канал соединяет стандартный вывод одной команды со стандартным вводом следующей. Он не имеет особого отношения к файлам — и уж точно не к перемещению файлов, созданных предыдущей командой в конвейере.

То, что вы хотите, этосписок.

От man bash:

   AND  and  OR  lists are sequences of one of more pipelines separated by
   the && and ││ control operators, respectively.  AND and  OR  lists  are
   executed with left associativity.  An AND list has the form

          command1 && command2

   command2  is  executed if, and only if, command1 returns an exit status
   of zero.

Самый простой способ выполнить простую проверку if-then для одной команды или сделать одну команду условной для успешной работы другой — использовать &&. Примеры:

[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.

sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).

Итак, для вашей конкретной команды просто выполните:

(The whole command you wrote) && mv moksha-0.1.0 moksha

решение3

Ты не можешьтрубкафайл через mv, по сути — mvне читает исходные файлы со стандартного ввода. В этом случае, ваш лучший выбор — либо изменить tarкаталог назначения (как вОтвет Ди Эфф) или переименовать его после свершившегося факта (как вОтвет Wildcard).

Я предпочитаю первый вариант, но использую -Cand --strip-componentsвместо --transform:

mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
  tar -xzC moksha --strip-components=1

( -Cволянет(На самом деле, создайте свой аргумент — по крайней мере, не на моих системах BSD или GNU tar.)

Это более переносимо (в BSD tarнет --transform) и не будет изменять имена файлов, которые содержат строку moksha-0.1.0в другом месте — вместо этого он просто удалит первый компонент пути каждого извлекаемого файла (например, moksha-0.1.0/ABOUT-NLSстанет просто ABOUT-NLS). Поскольку tarизменился на новый mokshaкаталог, все из архива будет извлечено туда.

Архив, ссылку на который вы дали в своем вопросе, имеет только один каталог в корне, но важно отметить, что использование этого метода для архива снесколькокаталоги в его корне будут сбрасывать все содержимое этих каталогов в один каталог, указанный -C. В таких случаях вам будет лучше обслуженоизвлечение и последующее переименование по мере необходимости.

Связанный контент