기껏해야 다음과 같은 전화를 받고 싶습니다.
$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를 사용하면 다음을 사용할 수 있습니다.경로/대상/검색