다양한 아카이브 형식의 모든 아카이브 파일을 반복적으로 찾고 해당 파일 이름 패턴을 검색합니다.

다양한 아카이브 형식의 모든 아카이브 파일을 반복적으로 찾고 해당 파일 이름 패턴을 검색합니다.

내가 바랄 수 있는 최선의 호출은 다음과 같다:

$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로 당신은 사용할 수 있습니다경로/대상/검색

관련 정보