찾기: 이름의 정규식

찾기: 이름의 정규식

내가 쓴다고 가정해보자:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

이 명령은 제 생각엔 제대로 작동할 것 같습니다. 다양한 정규식 옵션과 다양한 정규식 형식을 반복했지만 이러한 종류의 정규식이 find를 통해 작동하도록 할 수는 없습니다. find 및 정규식 파서와 관련하여 내가 잘못 알고 있는 간단한 것이 있습니까?

답변1

Find's는 -name정규 표현식을 사용하지 않습니다(질문의 원래 버전에서 사용됨). 쉘 글로브가 필요하며 이는 유효한 쉘 글로브가 아닙니다. 테스트를 사용하고 싶지만 -regex확장 정규식이나 {N}foo|bar표기법을 이해하는 다른 기능을 사용하도록 지시해야 합니다. 마지막으로 와 달리 -name테스트 -regex에서는 전체 경로 이름을 확인하므로 다음과 같은 것이 필요합니다.

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

을 사용하려면 다음을 -name수행할 수 있습니다.

find . \( \
       -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
    -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
       \) -printf "%f\n"

답변2

또 다른 옵션은 fd도구입니다.

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

답변3

적절한 파일 이름이 있다면(적어도 이 폴더에는) 다음과 같은 명령을 실행할 수 있습니다.

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

이렇게 하면 다양한 grep 옵션의 이점을 누릴 수 있습니다.

관련 정보