특정 확장자를 가진 파일을 반복하고 구문 분석된 파일 이름(확장자 없음)으로 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을 사용해야 합니다 .failglob
nullglob
failglob
shopt -u failglob
nullglob