내가 바랄 수 있는 최선의 호출은 다음과 같다:
$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"
...이 도구는
- 지정된 경로를 재귀적으로 검색
- zip, rar, 7z, tar.bz, tar.gz...와 같이 최소한 "가장 일반적인" 형식이어야 하는 지원되는 모든 아카이브 형식의 파일을 가져옵니다.
- 문제가 있는 이름 패턴이 있는지 보관된 파일 목록을 검색합니다(여기
*vacation*jpg
).
찾기 도구, tar, unzip 등을 사용하는 방법을 알고 있습니다. 이를 쉘 스크립트와 결합할 수 있지만 쉘 단일 라이너 또는 전용 도구(GUI 도구에 대한 힌트는 환영하지만 내 솔루션은 명령줄 기반이어야 함)와 같은 간단한 솔루션을 찾고 있습니다.
답변1
AVFS 솔루션보다 더 간단한 것을 원한다면 이를 수행하기 위한 Python 스크립트를 작성했습니다.방주 찾기. 당신은 실제로 이것을 할 수 있습니다
$ arkfind /path/to/search/ -g "*vacation*jpg"
이 작업은 재귀적으로 수행되므로 어떤 깊이에서든 아카이브 내의 아카이브를 볼 수 있습니다.
답변2
(에서 적응압축된 아카이브를 재귀적으로 grep하는 방법은 무엇입니까?)
설치하다AVFS, 아카이브 내에서 투명한 액세스를 제공하는 파일 시스템입니다. 먼저 이 명령을 한 번 실행하여 컴퓨터의 파일 시스템 보기를 설정하세요. 여기서 아카이브가 디렉터리인 것처럼 아카이브에 액세스할 수 있습니다.
mountavfs
그 이후에는 /path/to/archive.zip
인식된 아카이브인 경우 ~/.avfs/path/to/archive.zip#
해당 아카이브의 내용을 포함하는 것으로 보이는 디렉터리입니다.
find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*vacation*.jpg"
' {} 'Test::Version' \;
설명하다:
- AVFS 파일 시스템을 마운트합니다.
~/.avfs$PWD
현재 디렉토리의 AVFS 보기인 에서 아카이브 파일을 찾습니다 .- 각 아카이브에 대해 지정된 쉘 조각을 실행합니다(
$0
=archive 이름 및$1
=search 패턴 사용). $0#
아카이브의 디렉토리 보기입니다$0
.{\}
{}
내부 매개변수를 외부로 대체하는 경우에는 필요하지 않습니다 (일부는 이를 수행하고 일부는 그렇지 않음).find
{}
-exec ;
또는 zsh ≥4.3에서:
mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')
설명하다:
~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)
현재 디렉터리 및 해당 하위 디렉터리의 AVFS 보기에 있는 아카이브와 일치합니다.PATTERN(e\''CODE'\')
PATTERN이 발생할 때마다 CODE를 적용합니다. 일치하는 파일의 이름은 에 있습니다$REPLY
.reply
배열을 설정하면 일치하는 항목이 이름 목록으로 변환됩니다.$REPLY\#
아카이브의 디렉토리 보기입니다.$REPLY\#/**/*vacation*.jpg
*vacation*.jpg
아카이브의 파일을 일치시킵니다 .N
일치하는 항목이 없으면 glob 한정자는 패턴을 빈 목록으로 확장합니다.
답변3
또 다른 효과적인 솔루션은zgrep
zgrep -r filename *.zip
답변4
내 거대개해결책:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'
예:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'
결과는 다음과 같습니다.
foozip1.zip:
foozip2.zip:
foozip3.zip:
DESIRED_FILE_TO_SEARCH
foozip4.zip:
...
zip 파일만 원하시면클릭수상단:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'
파일 이름여기서는 두 번 사용되었으므로 변수를 사용할 수 있습니다.
find로 당신은 사용할 수 있습니다경로/대상/검색