Bash

Bash萬用字元不擴展

  • November 12, 2020

我正在嘗試為目錄中的每個文件創建一個目錄。

mkdir *

返回文件存在。所以我嘗試

mkdir *.d

它創建了一個名為“*.d”的目錄。如何強制萬用字元擴展?

萬用字元始終擴展為現有名稱。

您的命令mkdir *失敗,因為*擴展為的名稱已經存在。

您的命令mkdir *.d“失敗”,因為*.d與任何現有名稱都不匹配。因此,該模式在預設情況下保持未擴展1並創建一個名為的目錄*.d。您可以使用 刪除它rmdir '*.d'

為目前目錄中的每個正常文件創建一個目錄,以便新目錄與文件具有相同的名稱,但帶有.d後綴:

for name in ./*; do
   if [ -f "$name" ]; then
       # this is a regular file (or a symlink to one), create directory
       mkdir "$name.d"
   fi
done

或者,對於喜歡“單線”的人來說,

for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done

bash,你也可以做

names=( ./* )
mkdir "${names[@]/%/.d}"

但這不會檢查 glob 擴展為的內容是正常文件還是其他文件。

上述命令中的首字母./是為了防止文件名中包含初始破折號 ( -) 的文件名。破折號及其後面的字元將被解釋為mkdir.


1 一些 shell 有一個nullglobshell 選項,可以將不匹配的 shell 萬用字元擴展為空字元串。在bash此使用shopt -s nullglob.

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