어떻게 파일을 추출할 수 있나요?.tar.gz추출된 파일의 흔적을 유지하면서 보관하시겠습니까?
예를 들어 다음과 같은 파일 구조가 있다고 가정해 보겠습니다.
ROOT
╠═▶ children
║ ╠═▶ joe.txt
║ ╚═▶ george.txt
╠═▶ bar.txt
╠═▶ foo.txt
╚═▶ A̲R̲C̲H̲I̲V̲E̲.t̲a̲r̲.b̲z̲
├─▷ children
│ ├─▷ joe.txt
│ └─▷ bob.txt
├─▷ hello.txt
├─▷ world.txt
└─▷ foo.txt
이제 최신 파일을 유지하면서 아카이브에서 파일을 추출하는 경우 다음을 수행할 수 있도록 어떤 파일이 추출되었는지 알고 싶습니다.
tar xf ./ARCHIVE.tar.gz --keep-newer-files | xargs -I EXTRACTED_FILE echo EXTRACTED_FILE
답변1
--to-command
이 옵션을 사용하여 추출된 모든 파일의 인쇄를 트리거 하겠습니다 .
인수는 환경 변수 TAR_FILENAME을 사용하여 파일 이름을 가져오는 명령이며STDIN
STDIN
그래서 추출된 파일을 읽고 생성해야 하며 STDOUT
생성된 파일에 인쇄 할 수 있습니다.
tar -xzf ../ARCH.tgz --keep-newer-files \
--to-command="sh -c $(printf '%q' \
'mkdir -p "$(dirname "$TAR_FILENAME")";dd of="$TAR_FILENAME" >/dev/null 2>&1;echo "#EXTRACTED#$TAR_FILENAME" ')" > output_tar.txt
추출된 각 파일에는 한 줄이 있습니다 output_tar.txt
.
바라보다외부 프로그램에 쓰기자세한 내용은
답변2
내 요구 사항에 따라 아카이브 콘텐츠와 일치하는 사용 가능한 모든 추출 파일(최신 버전이든 아니든)을 나열해야 하는 경우가 있습니다.
이 경우 tar 추출이 수행되거나 수행되지 않으면 효과적으로 추출된 파일을 나열할 수 있습니다.
나는 이렇게 한다:
tar -xzf ./ARCH.tgz --keep-newer-files
for file in $(tar -tf ./ARCH.tgz 2>/dev/null)
do
if [[ -e $file && ! -d $file ]]
then
echo $file
fi
done > output_tar.txt
xargs를 사용하는 덜 명확하지만 깔끔한 솔루션은 다음과 같습니다.
tar -tf ./ARCH.tar 2>/dev/null | xargs -L1 bash -c 'if [[ -e $0 && ! -d $0 ]]; then echo $0; fi;'