다운로드 및 추출 기능을 사용한 후 STDOUT에 저장된 파일을 검색하는 방법은 무엇입니까?

다운로드 및 추출 기능을 사용한 후 STDOUT에 저장된 파일을 검색하는 방법은 무엇입니까?

대용량 tar.gz 파일을 다운로드하고 동시에 압축을 풀기 위해 아래 기능을 사용합니다. 이제 파일이 STDOUT에 저장되었습니다. 다른 파일 디렉터리로 어떻게 이동할 수 있나요?

wget -q -O - target URL | tar -zxvf -

답변1

STDOUT에서는 추출되지 않지만 아카이브 멤버는 상대 경로로 추출됩니다.현재 작업 디렉토리. 예를 들어, 아카이브에 , , 및 , Members 라는 멤버가 포함되어 있고 /foo현재 file1작업 dir디렉토리 dir/file2dir/link -> file2이면 files² , , , 가 /home/sosa생성됩니다 ./home/sosa/foo/home/sosa/file1/home/sosa/dir/home/sosa/dir/file2/home/sosa/dir/link

다른 디렉터리에 대한 상대 경로로 추출하려면 다음을 사용할 수 있습니다.

wget -q -O - URL | (cd some/other/directory && tar -zxvf -)

즉, 아카이브 멤버와 관련된 추출을 수행하기 전에 실행할 프로세스의 c현재 작업 디렉터리를 일시 중지합니다.dtartartar

일부 구현의 경우 다음 옵션을 tar사용할 수도 있습니다 .-C

wget -q -O - URL | tar -C some/other/directory -zxvf -

현재 작업 디렉토리에 아카이브를 추출했지만 파일을 다른 곳으로 이동하려는 경우 현재 디렉토리의 어떤 파일이 아카이브에서 추출되었는지, 어떤 파일이 이미 존재하는지 확인해야 합니다.

지난 10분 이내에 아카이브를 추출하고 해당 시간 간격 동안 현재 디렉터리의 다른 파일을 건드리지 않은 경우 zsh다음을 수행할 수 있습니다.

mv -- *(Dcm-10) /some/other/dir/

와 함께마지막으로 변경된 시간지난 10분 이내로 이동됨/some/other/dir/

find또는 및 의 GNU 구현을 사용하십시오 mv.

find . -mindepth 1 -maxdepth 1 -cmin -10 -exec mv -vt /some/other/dir {} +

위의 예에서는 foo, file1dir파일이 이동됩니다. 엄밀히 말하면 dir/file2파일은 이동되지 않고 여전히 디렉터리 dir/link에 연결 되어 있지만 dir디렉터리가 dir이동되면 새로운 전체 경로는 /some/other/dir/dir/file2./some/other/dir/dir/link

파일이 인식되는 시간 창을 분리할 수 없는 경우 아카이브를 다시 다운로드하여 아카이브 구성원 목록을 검색하고 각 파일의 첫 번째 경로 부분을 추출해야 합니다. 아카이브 멤버에 개행 문자가 포함되어 있지 않다고 가정하면 GNU 시스템에서는 다음을 수행할 수 있습니다.

xargs -rd'\n' -a <(
  wget -qO- URL |
    tar -ztf - |
    LC_ALL=C sed -E 's@^((|\.|\.\.)/)*@@; s@/.*@@; /^(|\.|\.\.)$/d' |
    LC_ALL=C sort -u) mv -vt some/other/dir --

wget아카이브를 다운로드 tar하고 -t해당 콘텐츠를 나열하고, sed선행 /, ./, ../구성 요소와 첫 번째 경로 구성 요소를 제외한 모든 구성 요소를 제거하고( foo/bar모두 , /foo/bar /.././../foo/bar로 변환 foo) sort -u중복 항목을 제거하고 xargs각 줄을 별도의 인수로 에 전달합니다 mv -t.

그러나 안전을 위해 이름을 바꾸기 전에 검토용으로 목록을 파일에 저장하는 것이 좋습니다.


1 최소한 OGNU tar를 사용하려면 옵션이 필요하지만 아카이브에 있는 모든 파일의 내용을 stdout으로 보내는 것(예: 터미널에서 명령을 실행하는 경우 표시하기 위해)은 아마도 원하는 것이 아닐 것입니다.

²보안 조치로 대부분의 tar구현에서는 추출 시 아카이브 구성원의 부트스트래핑을 제거합니다. /로 시작하는 구성원이 있는 경우 ../일부는 해당 구성원을 완전히 건너뛰고 일부는 구성 요소를 제거합니다 ../.

관련 정보