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

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

기껏해야 다음과 같은 전화를 받고 싶습니다.

$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= 아카이브 이름 및 $1= 검색할 패턴 포함).
  • $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아카이브의 파일 과 일치합니다 .
  • glob N한정자는 일치하는 항목이 없는 경우 패턴을 빈 목록으로 확장합니다.

답변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를 사용하면 다음을 사용할 수 있습니다.경로/대상/검색

관련 정보