Tar: 파일만 추출합니다(하위 디렉터리는 제외).

Tar: 파일만 추출합니다(하위 디렉터리는 제외).

어떻게 추출하나요오직tar 아카이브 내의 디렉토리에 파일이 있습니까? 특정 파일이 아닌 디렉터리의 모든 파일을 추출해야 합니다. 예를 들어 다음 구조의 tar 아카이브가 있습니다.

wordpress
 --wp-admin
 --wp-content
 --wp-includes
 --index.php
 --license.txt
 --readme.html

하위 디렉터리가 아닌 WordPress 디렉터리 내에서 3개 이상의 파일만 추출하고 싶습니다.

이 사이트에서 찾을 수 있는 다른 솔루션은 특정 파일 추출에 관한 것입니다. 내 질문은 추출에 관한 것입니다.모두문서.

답변1

디렉터리 이름과 파일 이름의 형식에 대해 가정할 수 없으면 동일한 수준에서 (빈) 디렉터리를 추출하지 않고 특정 수준에서 파일을 추출하는 방법을 찾을 수 없습니다. (파일 이름에 점이 포함되어 있지만 디렉토리에는 점이 없는 경우또 다른 대답충분할 것입니다. )

370358.tar이 내용을 고려해 보세요

wordpress/
wordpress/index.php
wordpress/license.txt
wordpress/readme.html
wordpress/wp-admin/
wordpress/wp-admin/admin.php
wordpress/wp-content/
wordpress/wp-content/2021/
wordpress/wp-content/2021/01/
wordpress/wp-content/2021/01/19/
wordpress/wp-content/2021/01/19/today.txt
wordpress/wp-content/content.txt
wordpress/wp-content/here.txt
wordpress/wp-content/some.txt
wordpress/wp-includes/

wordpress/*다음과 같이 일치하는 파일을 추출 할 수 있습니다

tar xf /tmp/370358.tar --wildcards --exclude '*/*/*' && rmdir */* 2>/dev/null

ls -R wordpress
wordpress:
index.php  license.txt  readme.html

후자에 유의하십시오 rmdir. tar결과 디렉토리가 비어 있더라도 디렉토리 생성을 건너뛰도록 지시할 수 없으므로 나중에 삭제할 수 있습니다.

wordpress실제로 디렉토리가 추출에 포함되는 것을 원하지 않는 경우 ,

tar xf /tmp/370358.tar --strip-components 1 --wildcards --exclude '*/*/*' && rmdir * 2>/dev/null

ls -R
.:
index.php  license.txt  readme.html

답변2

GNU를 사용한다고 가정하면 tar짧은 스크립트를 통해 아카이브를 추출할 수 있습니다 bash.

tar -x -f archive.tar --to-command=./script.sh

... script.sh실행 가능한 스크립트가 있는 곳

#!/bin/bash

if [ "$TAR_FILETYPE" = f ] &&
   [[ $TAR_FILENAME == wordpress/* ]] &&
   [[ $TAR_FILENAME != wordpress/*/* ]]
then
    mkdir -p "${TAR_FILENAME%/*}" &&
    cat >"$TAR_FILENAME" &&
    chmod "$TAR_MODE" "$TAR_FILENAME" &&
    chown "$TAR_UNAME:$TAR_GNAME" "$TAR_FILENAME" || true
else
    cat >/dev/null
fi

여기에 사용된 변수는 TAR_*스크립팅 환경에서 GNU에 의해 설정되며 tar현재 추출된 파일의 데이터는 표준 입력을 통해 도착합니다.

스크립트에 사용된 테스트는 다음을 보장합니다.

  1. 우리가 추출하는 파일은 일반 파일이고,
  2. wordpress파일은 다른 디렉토리가 아닌 해당 디렉토리에 있습니다 .

파일을 추출하려면 파일 디렉터리가 있는지 확인하고 표준 입력을 올바른 파일 이름으로 리디렉션한 다음 파일 모드와 소유권을 수정하여 권한과 소유자가 올바르도록 하면 됩니다.

분명히 명령줄에 스크립트를 포함시킬 수도 있습니다 tar.

tar -x -f archive.tar --to-command='bash -c "
    if [ \"\$TAR_FILETYPE\" = f ] &&
       [[ \$TAR_FILENAME == wordpress/* ]] &&
       [[ \$TAR_FILENAME != wordpress/*/* ]]
    then
        mkdir -p \"\${TAR_FILENAME%/*}\" &&
        cat >\"\$TAR_FILENAME\" &&
        chmod \"\$TAR_MODE\" \"\$TAR_FILENAME\" &&
        chown \"\$TAR_UNAME:\$TAR_GNAME\" \"\$TAR_FILENAME\" || true
    else
        cat >/dev/null
    fi"'

답변3

그러면 하위 디렉터리로 이동하지 않고 디렉터리의 모든 파일을 tar 파일로 추출합니다.

tar --wildcards --no-wildcards-match-slash -xvf file.tar.gz directory_in_tar/*.*

관련 정보