터미널에서 한 번에 여러 파일 추출

터미널에서 한 번에 여러 파일 추출

수백 개의 zip 파일이 포함된 디렉토리가 있습니다. 50개 정도의 파일을 선택하고 unzip터미널에서 (또는)을 사용하여 한 번에 모두 추출할 수 있게 하고 싶습니다 . 7z파일 이름이 완전히 다르기 때문에 정규식을 사용하여 일치시킬 수 없습니다.

간단한 예로 다음과 같은 세 개의 파일이 있습니다.

41a02d81b1c7b6225b11908c38b820cc.zip
d581697699c4321c32b733a9678.zip
ffb7077a319b2d168d5415b0f59a9e2ba3a.zip

수동으로 명령을 입력하지 않고 그 중 2개만 추출하고 싶습니다.

GUI를 사용하여 여러 파일을 선택한 다음 명령을 통해 처리하기 위해 목록을 bash로 내보내는 방법이 있습니까?

답변1

다음과 같은 경우 , shell 및 을 사용 zsh하십시오.

setopt auto_menu autolist correct no_list_ambiguous
setopt list_types auto_pushd no_list_beep

zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate _prefix
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
eval "$(dircolors)"
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*'
zstyle ':completion:*' max-errors 1 not-numeric
zstyle ':completion:*' menu select=2
zstyle ':completion:*' original true
zstyle ':completion:*' prompt 'correct> '
zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
zstyle ':completion:*' verbose true
zstyle ':completion:*' menu select=2
autoload -Uz compinit
compinit -i

( 여기서 ~/.zshrc이 모든 내용이 관련되는 것은 아니며 compinstall완료된 조정을 실행하여 얻을 수 있음에 유의하십시오) 다음을 입력할 수 있습니다.

$는 f를 나타냅니다(*.zipTab

zip이 시점에서 현재 디렉터리의 파일이 나열 되고 화살표 키와 을 사용하여 해당 파일을 선택하라는 메시지가 표시됩니다 Enter.

Enter항목을 선택하기 위해 +를 누르는 대신 Alt+를 누르면 A현재 항목이 삽입되지만 계속해서 더 많은 파일을 선택할 수도 있습니다.

마지막으로 파일을 눌러 Enter명령을 완료합니다. 예:

for f (file1.zip file2.zip) unzip -d $f:r $f

각 파일에 대해 이름은 동일하지만 확장자( in , in 등) .zip가 없는 디렉터리 로 추출됩니다 .file1.zipfile1/file2.zipfile2/

답변2

zsh// bash( ksh93또는 GNU 사용 ) 에서 printf다음을 수행할 수 있습니다.

$ printf 'unzip %q\n' ./*.zip > commands
$ vi commands

(또는 즐겨 사용하는 텍스트 편집기) 에서 vi압축을 풀고 싶지 않은 파일 줄을 삭제하세요. 변경 사항을 저장하다. 그런 다음 다음을 실행하십시오.

zsh -x ./commands

( zsh원하는 셸, 가급적이면 에서 명령을 실행하는 셸로 교체하세요 printf.)


unzip 'file.zip'파일에 명령을 저장하는 대신 파일만 저장할 수도 있습니다.

printf '%s\n' ./*.zip > files

그리고 편집하세요 files.

모든 파일 이름에 개행 문자가 포함되어 있지 않고 GNU를 사용한다고 가정합니다 xargs.

xargs -d '\n' -tr0a files -n1 unzip

압축을 푼다.


zsh를 사용하는 유사한 접근 방식은 유사한 작업을 수행하는 것이지만 파일을 편집하는 대신 vared내장 함수를 사용하여 변수를 편집합니다.

list=(*.zip)

$list현재 디렉터리의 zip 파일을 사용하여 배열을 시드합니다.

vared list

이렇게 하려면 압축을 풀고 싶지 않은 항목을 ed삭제하세요 . var그 다음에:

for f ($list) unzip -d $f:r $f

모든 파일을 $list.

답변3

당신은 그것을 사용할 수 있습니다아이셀렉트이를 위해. 목록(파일 이름 등)을 지정하면 터미널에 대화 상자가 나타나 하나 이상의 항목을 선택할 수 있습니다.

선택한 항목의 목록을 반환하며 해당 항목에 대해 원하는 작업을 수행할 수 있습니다.

나는 귀하와 유사한 작업을 수행하기 위해 수년 동안 스크립트에서 이를 여러 번 사용했습니다.

또는,자정 사령관디렉터리를 탐색할 수 있는(그리고 zip 파일을 "가져오기", 즉 디렉터리처럼 탐색할 수 있는) 완전한 기능을 갖춘 텍스트 모드 파일 브라우저이며, 파일 뷰어와 간단한 편집기가 내장되어 있으며, 파일을 선택할 수 있습니다. 내장 함수와 함께 사용되거나 외부 프로그램에 매개변수로 전달됩니다.

Midnight Commander는 잘 알려져 있으며 전부는 아니지만 대부분의 배포판에서 사용할 수 있습니다. iselect조금 모호합니다. 데비안에서는 각각 mc및 로 패키지되어 있습니다 iselect.

답변4

이런 종류의 일이 바로 X 선택/붙여넣기 규칙의 목적입니다.

find that/dir; while read; do whatever with $REPLY; done

그런 다음 세 번 클릭하여 스크롤백 버퍼 목록에서 한 줄을 선택하고 마우스 가운데 버튼을 클릭하여 터미널에 붙여넣습니다.목록에서 당신의 자리를 잃지 마십시오.

아니면 그만한 가치가 있는 편집기를 실행할 수 있습니다. emacs에는 dired가 내장되어 있고 vim에는 netrw가 내장되어 있으며 원하는 파일을 표시한 다음 표시된 파일로 원하는 작업을 수행할 수 있습니다.

또는 모든 명령을 파일로 생성하고 필요하지 않은 명령을 편집할 수 있습니다.

find that/dir -iname \*.zip -printf '7z x %p\n' | vim -R -

그런 다음 버퍼는 셸을 통해 파이프됩니다.

관련 정보