다른 디렉토리의 tar 아카이브에서 파일 이름 찾기

다른 디렉토리의 tar 아카이브에서 파일 이름 찾기

배치 스크립트를 작성하고 싶습니다.

  • 파일 이름 찾기
  • 파일 이름은 tar 아카이브 안에 있습니다.
  • tar 아카이브가 다른 디렉토리에 있습니다.
  • 파일 이름이 지정된 패턴과 일치합니다.

나는 원해요껍질을 벗기지 마십시오, 가능하다면 원하는변수에 파일 이름 저장.

내 tar 파일은 에 있습니다 ./foo_tar. tar 아카이브에서 로 시작하고 그 뒤에 숫자와 밑줄(예: ) bar.tar.gz이 오는 파일 이름을 가져오고 싶습니다 .baz*baz1234_

지금까지 find명령을 알고 있지만 tar 파일에 액세스하려고 하면 작동하지 않습니다. 나는 다음과 같은 것을 원합니다 :

filename_in_question=$(find ./foo_tar/bar.tar.gz -name 'baz*')

해결책이 있나요?

답변1

Tar 자체는 와일드카드를 사용할 수 있습니다.

tar tzvf ./foo_tar/bar.tar.gz --wildcards '*/baz*'

예를 들어. :

$ filename_in_question=$(tar tvf test.tar --wildcards '*/received_10205861111464136.mp4')
$ echo $filename_in_question
-rwxr-xr-x ghp/ghp 1931930 2017-11-04 10:36 ./Marieanne/Messenger/received_10205861111464136.mp4
$ echo ${filename_in_question/*\//}
received_10205861111464136.mp4

답변2

find아카이브 내에 저장된 파일이 아닌 디렉터리 계층 구조에 있는 파일만 검색됩니다. 다음 명령을 사용하여 파일을 나열할 수 있습니다 tar -t.

tar -ztf ./foo_tar/bar.tar.gz --wildcards --no-anchored 'baz*'

--wildcards*와일드카드로 해석 할 수 있으며 --no-anchored파일 이름이 파일 이름 뒤에 일치하도록 허용합니다 /(따라서 아카이브의 하위 디렉터리에 있는 경우 계속 찾을 수 있음).

의 패턴 일치는 tar에서만큼 유연하지 않습니다 find. 설명하는 패턴의 경우 다음을 통해 전체 콘텐츠를 필터링할 수 있습니다 grep.

tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_'

결과를 변수에 저장하려면 명령을 다음과 같이 묶어야 합니다.명령 대체:

filename_in_question=$(tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_')

를 사용하는 경우에도 이 작업이 필요합니다 find.

답변3

내장 tar 구현이 필요합니다 libfind.

star -t -f ./foo_tar/bar.tar.gz -find -name 'baz*'

예상대로 작동하고 더 많은 일을 할 수 있습니다.

schilytools 타르 볼을 확인하세요.http://sourceforge.net/projects/schilytools/files/

star가장 오래된 무료 tar 구현입니다. 매뉴얼 페이지를 참조하십시오:

http://schilytools.sourceforge.net/man/man1/star.1.html

관련 정보