Апредыдущий вопросмой спрашивал, как перенаправить загруженные файлы через 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.0
moksha
moksha-0.1.0
moksha
решение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).
Я предпочитаю первый вариант, но использую -C
and --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
. В таких случаях вам будет лучше обслуженоизвлечение и последующее переименование по мере необходимости.