수백 개의 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.zip
file1/
file2.zip
file2/
답변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 -
그런 다음 버퍼는 셸을 통해 파이프됩니다.