ls 명령의 결과를 필터링하고 형식에 따라 특정 파일 이름만 가져옵니다.

ls 명령의 결과를 필터링하고 형식에 따라 특정 파일 이름만 가져옵니다.

g_inboundDir다음 파일이 포함된 디렉터리가 있습니다 .XAI-001-20170709-123456791.pdf YXAI-001-20170709-123456791.pdf 001-20170744-123456791.pdf

Variable g_filPfix="XAI" Variable g_fileExt=".pdf"

이제 XAI로 시작하는 모든 파일을 선택하고 처리하려고 합니다. 이를 위해 다음 명령을 작성했습니다.

for i in `ls ${g_inboundDir}/* | grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$' 2>/dev/null`

XAI-001-20170709-123456791.pdf 파일만 받을 것으로 예상했는데 아무 것도 받지 못했습니다.

답변1

구문 분석되지 않았습니다 ls.

for file in "${g_inboundDir}"/XAI*.pdf; do 
    things_to "$file"
done

답변2

grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$'

여기서 즉각적인 문제는 for 패턴이 grep작은따옴표로 묶여 있으므로 쉘이 변수 g_filPfixsum 을 확장하지 않는다는 것입니다 g_fileExt. 따옴표를 큰따옴표로 바꾸면 문제가 해결됩니다. (그리고 패턴에는 괄호가 필요하지 않습니다.)

ls공백이나 이상한 문자가 포함된 파일 이름에 대해 유사한 출력을 구문 분석하는 데 문제가 있을 수 있습니다. 특히, 사이에 공백이 있는 파일 이름은 두 개의 파일 이름으로 처리됩니다.

실제로 이러한 엄격한 패턴이 필요하지 않은 경우 주어진 접두사와 접미사가 있는 모든 파일을 처리하면 됩니다.

for f in "$dir/$prefix"*"$suffix" ; do 
    somecmd "$f"
done

엄격한 패턴이 정말로 필요한 경우 일부 셸(예: Linux에 있는 Bash)은 외부 도구 없이 정규식 일치를 수행할 수 있습니다. 따라서 디렉토리의 모든 파일을 반복하고 패턴과 일치하지 않는 파일을 무시하려면 다음을 수행하십시오.

for f in "$dir"/* ; do 
    [[ "$f" =~ "/$prefix"-[0-9]{3}-[0-9]{8}-[0-9]{9}"$suffix"$ ]] || continue
    somecmd "$f"
done

답변3

ls를 grep하지 마십시오. 대신 find 및 regexp를 사용하세요.

find ${g_inboundDir} -regextype sed -regex "^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$"

마지막으로 -exec를 사용하여 이러한 파일에 대해 특정 작업을 수행할 수 있습니다.
확인하다사람들이 발견했습니다찾기에 대해 자세히 알아보세요 :)

관련 정보