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_filPfix
sum 을 확장하지 않는다는 것입니다 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를 사용하여 이러한 파일에 대해 특정 작업을 수행할 수 있습니다.
확인하다사람들이 발견했습니다찾기에 대해 자세히 알아보세요 :)