컨텍스트: OSX Catalina(zSh) 및 Ubuntu 16.04(Bash). OSX 터미널 명령:
FILES="$PWD/*" #list of files
echo $FILES
모든 파일의 문자열을 콘솔에 반환합니다. 현재는 처리하려는 디렉터리에 스크립트 복사본을 심을 계획입니다. 앞으로는 스크립트가 처리할 매개변수(디렉토리)를 받아들일 수 있게 하고 싶습니다.
파일 형식이 작업 디렉터리(숨겨진 파일 대신 확장명)에 있다고 가정합니다.
- .알파벳
- .알파벳
- .def
- .ghi
- .jkl
- .쉿
위 지침의 수정된 예에 관심이 있습니다.
- .abc, .ABC 및 .def 파일 형식(확장자)만 명시적으로 선택합니다.
- 모든 파일 선택와는 별개로.sh 및 .jkl
이상적으로는 대소문자를 구분하지 않는 명령 옵션이 있습니다.
답변1
Bash의 배열을 사용하여 이 작업을 쉽게 수행할 수 있습니다(이것은 Ubuntu의 기본 셸이고 최신 버전의 macOS는 bash 또는 zsh입니다. 이러한 솔루션은 bash와 관련되어 있습니다).
모든 파일을 선택합니다(원본 명령, 약간 수정됨).
$ shopt -s nullglob $ files=(*) $ echo "${files[@]}" file.abc file.ABC file.def file.ghi file.jkl file.sh
nullglob
디렉토리가 비어 있는 경우 이 옵션을 켜면 빈 목록이 제공됩니다. 이 옵션이 없으면 디렉토리가 비어 있으면files
확장되지 않은 요소 목록이 있게 됩니다*
..abc
.ABC
이름이 or 또는 로 끝나는 파일 만 선택하십시오.def
.$ shopt -s nullglob $ files=(*.abc *.ABC *.def) $ echo "${files[@]}" file.abc file.ABC file.def
.sh
이름이 또는로 끝나는 파일을 제외한 모든 파일을 선택하십시오 ..jkl
$ shopt -s extglob nullglob $ files=(!(*.sh|*.jkl)) $ echo "${files[@]}" file.abc file.ABC file.def file.ghi
대소문자를 구분하지 않는 일치
$ 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의 영향을 받습니다. 그런 다음 문자가 포함되어 있지 않다고 가정 합니다.$FILES
bash
zsh
$FILES
$FILES
$IFS
나뉘다섹션), $PWD
와일드카드(glob 섹션도 트리거함)를 포함하지 않는 경우 값은 일치하는 파일 목록으로 확장됩니다.
Split+glob 에서 zsh
매개변수 확장은 암시적으로 수행되지 않으며 명시적으로 요청해야 합니다( $=FILES
분할의 경우, $~FILES
와일드카드의 경우, $=~FILES
둘 다의 경우).
그러면 echo
를 사용하여 임의의 데이터를 출력하는 것도 오류이고, echo
기본적으로 추가 처리를 하는 것도 오류입니다( 또는 을 zsh
사용할 수 있음 ).echo -E - $files
print -r -- $files