ㅏ이전 질문내 친구가 tar를 통해 다운로드한 파일을 전송하는 방법을 물었고 이제는 mv를 통해 tar의 출력을 전송하는 방법을 알고 싶습니다. 이제 다음 명령이 있습니다.
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
예:ABOUT-NLS
. tar
새 디렉터리로 변경했으므로 아카이브 moksha
의 모든 내용이 새 디렉터리로 추출됩니다.
질문에 링크한 아카이브의 루트에는 디렉토리가 하나만 있지만 아카이브에서 이 기술을 사용한다는 점에 유의하는 것이 중요합니다.많은 종류의루트에 있는 디렉터리는 해당 디렉터리의 모든 내용을 지정된 디렉터리로 덤프합니다 -C
. 이 경우 더 나은 서비스를 받을 수 있습니다.필요에 따라 추출한 다음 이름을 바꿉니다..