Linux

循環瀏覽具有特定副檔名的文件(並非所有副檔名都可能存在)

  • November 10, 2022

我有以下簡單的腳本來遍歷具有特定副檔名的文件,並生成一個帶有已解析文件名的 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 允許不匹配文件的模式(參見上面的路徑名擴展)擴展為空字元串,而不是它們本身。

例如,將差異與nullglobset 和 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.

引用自:https://unix.stackexchange.com/questions/724322