..png)
어떻게 추출하나요오직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
현재 추출된 파일의 데이터는 표준 입력을 통해 도착합니다.
스크립트에 사용된 테스트는 다음을 보장합니다.
- 우리가 추출하는 파일은 일반 파일이고,
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/*.*