배치 스크립트를 작성하고 싶습니다.
- 파일 이름 찾기
- 파일 이름은 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 구현입니다. 매뉴얼 페이지를 참조하십시오: