mv 파이프를 통해 tar의 출력을 파이프하는 방법은 무엇입니까?

mv 파이프를 통해 tar의 출력을 파이프하는 방법은 무엇입니까?

이전 질문내 친구가 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.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통해 이 출력 디렉토리의 이름을 바꾸는 방법을 알고 싶습니다 . 파이프 없이 이 작업을 수행하는 방법을 알고 있지만 여전히 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. 이 경우 더 나은 서비스를 받을 수 있습니다.필요에 따라 추출한 다음 이름을 바꿉니다..

관련 정보