선택적으로 파일 목록으로 돌아가기

선택적으로 파일 목록으로 돌아가기

컨텍스트: OSX Catalina(zSh) 및 Ubuntu 16.04(Bash). OSX 터미널 명령:

FILES="$PWD/*"  #list of files
echo $FILES

모든 파일의 문자열을 콘솔에 반환합니다. 현재는 처리하려는 디렉터리에 스크립트 복사본을 심을 계획입니다. 앞으로는 스크립트가 처리할 매개변수(디렉토리)를 받아들일 수 있게 하고 싶습니다.

파일 형식이 작업 디렉터리(숨겨진 파일 대신 확장명)에 있다고 가정합니다.

  • .알파벳
  • .알파벳
  • .def
  • .ghi
  • .jkl
  • .쉿

위 지침의 수정된 예에 관심이 있습니다.

  1. .abc, .ABC 및 .def 파일 형식(확장자)만 명시적으로 선택합니다.
  2. 모든 파일 선택와는 별개로.sh 및 .jkl

이상적으로는 대소문자를 구분하지 않는 명령 옵션이 있습니다.

답변1

Bash의 배열을 사용하여 이 작업을 쉽게 수행할 수 있습니다(이것은 Ubuntu의 기본 셸이고 최신 버전의 macOS는 bash 또는 zsh입니다. 이러한 솔루션은 bash와 관련되어 있습니다).

  1. 모든 파일을 선택합니다(원본 명령, 약간 수정됨).

     $ shopt -s nullglob
     $ files=(*)
     $ echo "${files[@]}"
     file.abc file.ABC file.def file.ghi file.jkl file.sh
    

    nullglob디렉토리가 비어 있는 경우 이 옵션을 켜면 빈 목록이 제공됩니다. 이 옵션이 없으면 디렉토리가 비어 있으면 files확장되지 않은 요소 목록이 있게 됩니다 *.

  2. .abc.ABC이름이 or 또는 로 끝나는 파일 만 선택하십시오 .def.

    $ shopt -s nullglob
    $ files=(*.abc *.ABC *.def)
    $ echo "${files[@]}"
    file.abc file.ABC file.def
    
  3. .sh이름이 또는로 끝나는 파일을 제외한 모든 파일을 선택하십시오 ..jkl

    $ shopt -s extglob nullglob
    $ files=(!(*.sh|*.jkl))
    $ echo "${files[@]}"
    file.abc file.ABC file.def file.ghi
    
    
  4. 대소문자를 구분하지 않는 일치

    $ shopt -s nocaseglob nullglob
    $ files=(*abc)
    $ echo "${files[@]}"
    file.abc file.ABC
    

또한, 당신이 무엇을 하고 있는지 알아두세요. files="$PWD/*"값은 $files현재 디렉터리의 모든 파일에 설정되지 않습니다. 해당 값은 다음으로 끝나는 문자열로 설정됩니다 /*.

$ cd /tmp/current_directory
$ files="$PWD/*" 
$ echo "$files"
/tmp/current_directory/*

작동한다고 생각하는 이유는 따옴표 없이 사용하기 때문입니다 echo $files. 이는 쉘이 확장되고 있음을 의미합니다 /tmp/current_directory/*. 그러나 이후에 이러한 파일을 삭제하면 동일한 echo명령이 원래 명령을 실행했던 디렉터리로 인쇄 /tmp/current_directory/*되고 확장됩니다. $PWD파일 목록은 변수와 함께 저장되지 않습니다. 여기서와 같이 배열을 사용하면 변수가 사용 위치에 따라 다른 값으로 확장될 수 있는 glob뿐만 아니라 실제 파일 목록도 저장하게 됩니다.

답변2

존재하다 zsh:

files=($PWD/*.(abc|ABC|DEF)(N))
print -rC1 -- $files # print raw, on one column.

( 오류를 보고하는 대신 빈 패턴 목록이 어떤 파일과도 일치하지 않도록 glob에 적용된 한정자를 (N)사용합니다 .)nullglob$files

.sh및 이외의 파일의 경우 .jkl:

set -o extendedglob # needed for the ^ negation operator
files=($PWD/^*.(sh|jkl)(N))

.ABC대소문자를 구분하지 않는 일치( / .abc/ .Abc...) 의 경우 :

set -o extendedglob
files=($PWD/*.(#i)abc(N))

당신의:

FILES="$PWD/*"
echo $FILES

여러 계정이 잘못되었습니다.

FILES="$PWD/*"파일 목록을 $FILE변수에 저장하지 마십시오. 이는 단일 값만 저장할 수 있는 스칼라 할당입니다. 대신 $FILES문자 그대로의 의미가 뒤에 오는 내용 에 저장됩니다 .$PWD/*

인용 echo $FILES되지 않은 것처럼 ( 그러나 아님 )의 확장은 분할+glob의 영향을 받습니다. 그런 다음 문자가 포함되어 있지 않다고 가정 합니다.$FILESbashzsh$FILES$FILES$IFS나뉘다섹션), $PWD와일드카드(glob 섹션도 트리거함)를 포함하지 않는 경우 값은 일치하는 파일 목록으로 확장됩니다.

Split+glob 에서 zsh매개변수 확장은 암시적으로 수행되지 않으며 명시적으로 요청해야 합니다( $=FILES분할의 경우, $~FILES와일드카드의 경우, $=~FILES둘 다의 경우).

그러면 echo를 사용하여 임의의 데이터를 출력하는 것도 오류이고, echo기본적으로 추가 처리를 하는 것도 오류입니다( 또는 을 zsh사용할 수 있음 ).echo -E - $filesprint -r -- $files

관련 정보