Linux
循環瀏覽具有特定副檔名的文件(並非所有副檔名都可能存在)
我有以下簡單的腳本來遍歷具有特定副檔名的文件,並生成一個帶有已解析文件名的 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>
就個人而言,我傾向於使用,但您可以通過設置選項
find
在 bash 中執行此操作。nullglob
即在你的for
循環之前的某個地方,添加:shopt -s nullglob
來自
man bash
:
nullglob
如果設置,bash 允許不匹配文件的模式(參見上面的路徑名擴展)擴展為空字元串,而不是它們本身。
例如,將差異與
nullglob
set 和 unset 進行比較。首先,取消設置(這通常是預設設置,除非您在 .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
即 for 循環不列印任何內容,因為 nullglob 設置阻止了不匹配的 glob 擴展到自身。
請注意,在 bash 中,該
failglob
選項優先於nullglob
. 所以如果failglob
設置了,nullglob
沒有效果。如果failglob
可能已設置,您需要取消設置shopt -u failglob
才能使用nullglob
.