xargs 및 grep을 사용하여 디렉토리 내용 나열

xargs 및 grep을 사용하여 디렉토리 내용 나열

특정 패턴으로 이름이 지정된 json 및 pdf 파일이 많이 포함된 디렉터리가 있습니다. \d{11}-\d\.(?:json|pdf)명령에서 다음 패턴을 사용하여 이름으로 파일을 필터링 하려고 합니다 . 어떤 이유로 작동하지 않습니다. 나는 이것이 xargs가 인수를 하나의 큰 문자열 줄로 사용하거나 입력이 분할될 때 공백, \n 또는 null 문자가 있기 때문이라고 생각합니다.

ls | xargs -d '\n' -n 1 grep '\d{11}-\d\.(?:json|pdf)'

이 작업을 시도하면 ls | xargs -d '\n' -n 1 grep '\d'숫자가 포함된 파일 이름이 선택되고 여러 정규식을 지정하면 일치하는 항목이 없습니다.

답변1

먼저, grep이 파일 이름 목록이 아닌 ls | xargs grep 'pattern'나열된 파일 내용에서 항목을 찾도록 합니다 . ls파일 이름을 찾으려면 다음을 수행하면 충분합니다.

ls | grep 'pattern'

둘째, grep '\d{11}-\d\.(?:json|pdf)'GNU grep 및 -P 옵션에서만 작동합니다. 다음 구문을 사용하십시오 - grep의 GNU, busybox 및 FreeBSD 구현에서 작동합니다:

ls | grep -E '[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

제삼,ls를 구문 분석하는 것은 좋은 생각이 아닙니다.. 사용 GNU find:

find . -maxdepth 1 -regextype egrep -regex '.*/[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

또는 FreeBSD에서 다음을 찾으세요:

find -E . -maxdepth 1 -regex '.*/[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

답변2

복잡성이 필요하지 않습니다. 그냥 쉘 글로브를 사용하세요. 이는 지원 대안을 bash이해 하는 쉘과 같은 쉘에서 작동합니다 .{x,y}

ls *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9].{json,pdf}

일치하는 파일로 작업을 수행하려면 출력을 얻는 대신 lsglob을 사용하여 파일을 직접 반복하면 됩니다.

관련 정보