Naidim回答了這個問題: How to replace spaces in file names using a bash script有人可以解釋這個工作Bash代碼嗎?
這是唯一的答案我可以得到爲我工作,但我不明白我在看。
for f in *\ *; do mv "$f" "${f// /_}"; done
- 我不知道for循環只想通過所有的文件中搜索與此基本語法。
- 我看到mv聲明,但是這個命令是什麼擴展?
Naidim回答了這個問題: How to replace spaces in file names using a bash script有人可以解釋這個工作Bash代碼嗎?
這是唯一的答案我可以得到爲我工作,但我不明白我在看。
for f in *\ *; do mv "$f" "${f// /_}"; done
其分解:
*\ *
是文件名glob模式。這擴展到當前目錄中的所有文件中都有空格。通常會將參數與命令分開(這會在全局擴展之前發生),但在使其成爲文字空間並因此成爲全局模式的一部分之前有一個轉義。
for f in *\ *
;是一個for循環,循環遍歷in
之後的所有內容 - 在這種情況下,glob擴展的文件列表。變量f
將依次設置爲每個文件名,並且將爲每個文件名執行直至done
命令的代碼。
"$f"
是一個變量擴展。變量擴展之前字拆分(不像glob擴展),所以引號是必要的,以保持文件名中的空格togther作爲單個參數的一部分,而不是分成多個參數。
${f// /_}
是一個帶替代的變量擴展。最初的//
表示該模式重複應用於變量內容,而不僅僅是一次。 / /
之間的空格是要搜索的模式,最後的_
是替換,因此f
(循環中的文件名)中的所有空格都將替換爲下劃線。
要了解此代碼,您可能需要了解更多關於globbing和Bash parameter expansion的信息。
*\ *
=>是匹配在當前目錄中具有一個以上的空間在他們${f// /_}
=>擊參數擴展替換用-
空間在可變f
(1所有條目中的glob:1更換)因此,循環於當前目錄(文件,目錄,在其名稱中含有空格,並將其重命名爲到位的空間使用_
名稱符號鏈接等)拿起所有條目。
令人困惑的擴展是參數替換。表格${foo/bar/baz}
用於搜索$foo
中的字符串bar
,並用baz
替換它。如果bar
以/
開頭(如循環中的情況),則全部出現的bar
被替換爲baz
。有關更多信息,您可以閱讀bash手冊頁中的Parameter Expansion
標題。
哇,謝謝!我們中有些人正在試圖打破這種情況,但從未見過這樣的命令。 – Ambrose