mv를 통해 tar의 출력을 어떻게 파이프합니까?

mv를 통해 tar의 출력을 어떻게 파이프합니까?

이전 질문나는 다운로드한 파일을 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.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-NLSjust 가 됨 ABOUT-NLS). tar이 새 디렉터리로 변경되었으므로 아카이브 moksha의 모든 내용이 새 디렉터리로 추출됩니다.

질문에 링크한 아카이브에는 루트에 디렉토리가 하나만 있지만 아카이브에서 이 기술을 사용하는 것이 중요합니다.다수의루트에 있는 디렉터리는 해당 디렉터리의 모든 내용을 에서 지정한 디렉터리로 덤프합니다 -C. 그런 경우에는 더 나은 서비스를 받을 수 있습니다.필요에 따라 추출한 다음 이름을 바꿉니다..

관련 정보