특정 확장자를 가진 파일을 반복합니다. (모든 확장자가 없을 수도 있습니다.)

특정 확장자를 가진 파일을 반복합니다. (모든 확장자가 없을 수도 있습니다.)

특정 확장자를 가진 파일을 반복하고 구문 분석된 파일 이름(확장자 없음)으로 XML 파일을 생성하는 다음과 같은 간단한 스크립트가 있습니다. 그러나 디렉터리에 확장자가 없으면 *.ext가 생성되어 결과가 엉망이 됩니다. *.wlens와 같은 이름이 아닌 실제 파일의 이름만 가져오도록 하려면 어떻게 해야 합니까?

PS 파일 이름에 "."가 포함될 수 있으므로 좀 더 복잡한 이름 확인(sed)을 수행하고 있습니다. 이를 수행하는 더 효율적인 방법이 있다면 귀하의 의견에 감사드립니다.

#!/bin/bash

echo "
<?xml version="1.0" encoding="UTF-8"?>

<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
    " > retrieve_xmd_build_package.xml

for i in *.{wdash,wcomp,wlens};
do
   
    echo "<members>" >> retrieve_xmd_build_package.xml 
    echo "    " "$i"| sed 's#^\(.*\)\.\(.*\)#\1#'     >> retrieve_xmd_build_package.xml 
    echo "</members>" >> retrieve_xmd_build_package.xml 
done

echo "<name>WaveXMD</name>" >> retrieve_xmd_build_package.xml 
echo "

   </types>

   <version>56.0</version>

</Package>

" >> retrieve_xmd_build_package.xml


확장명 중 하나를 잘못 입력한 결과는 다음과 같습니다.


<?xml version=1.0 encoding=UTF-8?>

<Package xmlns=http://soap.sforce.com/2006/04/metadata>
    <types>
    
<members>
     weekday DASH
</members>
<members>
     *
</members>
<members>
     weekday LENS 2
</members>
<members>
     weekday LENS
</members>
<name>WaveXMD</name>


   </types>

   <version>56.0</version>

</Package>

답변1

개인적으로 나는 를 사용하는 것을 선호 find하지만 bash에서 options 을 설정하여 이 작업을 수행할 수 있습니다 nullglob. 즉, 루프 앞 어딘가에 추가하십시오 for.

shopt -s nullglob

에서 man bash:

nullglob

설정된 경우, bash는 어떤 파일과도 일치하지 않는 패턴(위의 경로 이름 확장 참조)이 자신이 아닌 빈 문자열로 확장되도록 허용합니다.

예를 들어, nullglob설정과 설정 해제의 차이를 비교해 보세요. 먼저 설정을 해제합니다(.bashrc 또는 기타 구성 파일 스크립트에서 설정하지 않는 한 일반적으로 기본값).

$ shopt -u nullglob
$ for i in *.{wdash,wcomp,wlens}; do echo "$i"; done
*.wdash
*.wcomp
*.wlens

이러한 파일 glob은 현재 디렉터리에 존재하지 않으므로 nullglob설정을 해제하면 bash는 일치하지 않는 glob을 자체적으로 확장합니다(즉, glob을 리터럴 문자열로 사용함).

다음으로 nullglob을 설정합니다:

$ shopt -s nullglob
$ for i in *.{wdash,wcomp,wlens}; do echo "$i"; done

즉, nullglob 설정은 일치하지 않는 glob이 자체적으로 확장되는 것을 방지하기 때문에 for 루프는 아무것도 인쇄하지 않습니다.

Bash에서는 이 failglob옵션이 에 우선하므로 설정해 nullglob도 아무런 효과가 없습니다 . 설정되어 있는 경우 이를 사용하려면 Unset을 사용해야 합니다 .failglobnullglobfailglobshopt -u failglobnullglob

관련 정보