ls *.csv --ignore="*pattern*" "패턴"이 포함된 파일을 반환합니다.

ls *.csv --ignore="*pattern*" "패턴"이 포함된 파일을 반환합니다.

ls --ignore패턴을 무시하지 않는가?

다음 예를 살펴보십시오.

mkdir books
cd books
touch books_abby.csv
touch books_karen.csv
touch books_david.csv
touch books_tom.csv

그러면 다음과 같은 4개의 파일이 생성됩니다.

$ ls
books_abby.csv  books_david.csv  books_karen.csv  books_tom.csv

그러나 "tom"이 포함된 모든 파일 이름을 무시하고 나열하려는 경우에도 books_tom.csv다음이 반환됩니다.

$ ls *.csv --ignore="*tom*"
books_abby.csv  books_david.csv  books_karen.csv  books_tom.csv

예상되는 결과는 "tom"이 포함된 파일이 생략되는 것입니다.

$ ls *.csv --ignore="*tom*"
books_abby.csv  books_david.csv  books_karen.csv

답변1

플래그는 ls매뉴얼 페이지에 다음과 같이 설명되어 있습니다.(강조는 내 것)...

목록에 없음암묵적으로쉘 패턴과 일치하는 항목

매뉴얼 페이지에는 "묵시적"에 대한 내용이 많이 나와 있지 않습니다. 그렇다면 이것이 정확히 무엇을 의미합니까? 암시적 항목(파일, 디렉터리 등)은 ls해당 항목과 일치하는 매개 변수를 명시적으로 제공하지 않는 경우 반환되는 항목입니다. 일치 항목은 항목의 실제 이름( ls books_tom.csv ...예를 사용하여)이거나 일치하는 glob( ls *tom.csv예를 들어)일 수 있습니다.

이것을 극단적인 논리적으로 생각해보면, ls인수 없이 호출하면 반환된 모든 것이 암시적입니다! 나는 가장 일반적인 용도가 이와 같은 --ignore순진한 ls호출이라고 가정합니다. 왜냐하면 "X를 제외한 모든 항목 나열" 작업을 수행하는 가장 쉬운 방법이기 때문입니다... 적어도 다른 명령을 사용하지 않으려는 경우에는 말이죠.

그럼, 당신의 명령을 살펴 보겠습니다. ls *.csv --ignore="*tom*"패턴을 일치 시켜 "books_tom.csv"에 대한 명시적 참조입니다 *.csv. 의 경우 ls --ignore="*tom*"이전 단락에 따르면 디렉터리의 모든 내용이 암시되므로 "books_tom.csv"는 표시되지 않습니다.

쉘에서 확장된 와일드카드를 사용할 수 있는 경우(bash를 통해 활성화할 수 있음 shopt -s extglob) "tom"을 제외하는 패턴을 만들어 원하는 것을 얻을 수 있습니다. 예를 들어 ls books_!(tom).csv표시되지만 books_abby.csv표시되지는 않습니다 books_tom.csv.

(물론 , find파이프라인 grep -v등과 같은 다른 도구를 사용할 수도 있습니다. 저는 단지 순수한 ls솔루션을 제공할 뿐입니다.)

관련 정보