ㅏ이전 질문나는 다운로드한 파일을 tar를 통해 파이프하는 방법을 물었고 이제 tar의 출력을 mv를 통해 파이프하는 방법을 알고 싶습니다. 지금은 다음 명령이 있습니다.
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz
그러면 이라는 디렉토리가 생성되지만 이 명령 끝에 있는 파이프( )를 통해 moksha-0.1.0
이 출력 디렉토리의 이름을 로 바꾸는 방법을 알고 싶습니다 . 파이프 없이 이 작업을 수행하는 방법을 알고 있지만 여전히 wget 및 tar와 동일한 코드 줄에 있는 경우에도 기꺼이 이를 수락하겠습니다.moksha
|
분명히 말하면 나는 다음과 같은 사실을 알고 있습니다.
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
이 출력 디렉토리의 이름을 로 바꾸는 방법을 알고 싶습니다 . 파이프 없이 이 작업을 수행하는 방법을 알고 있지만 여전히 wget 및 tar와 동일한 코드 줄에 있는 경우에도 기꺼이 이를 수락하겠습니다.moksha
|
파이프는 한 명령의 표준 출력을 다음 명령의 표준 입력과 연결합니다. 파일과는 별로 관련이 없습니다. 파이프라인에서 이전 명령으로 생성된 파일 이동과는 확실히 관련이 없습니다.
당신이 원하는 것은목록.
에서 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
대상 디렉터리를 변경하는 것입니다(예:디 에프의 답변) 또는 사실 이후에 이름을 바꾸거나(예:와일드카드의 답변).
나는 전자를 선호하지만 대신 -C
다음을 사용합니다 .--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
just 가 됨 ABOUT-NLS
). tar
이 새 디렉터리로 변경되었으므로 아카이브 moksha
의 모든 내용이 새 디렉터리로 추출됩니다.
질문에 링크한 아카이브에는 루트에 디렉토리가 하나만 있지만 아카이브에서 이 기술을 사용하는 것이 중요합니다.다수의루트에 있는 디렉터리는 해당 디렉터리의 모든 내용을 에서 지정한 디렉터리로 덤프합니다 -C
. 그런 경우에는 더 나은 서비스를 받을 수 있습니다.필요에 따라 추출한 다음 이름을 바꿉니다..