Shell
從所有文件名中刪除撇號
我試圖從目錄中所有文件的名稱中刪除撇號。
for i in *; do mv $i `echo $i | tr -d "'"`; done
執行此命令後,沒有重命名。
你知道這裡有什麼問題嗎?
你可以嘗試這樣的事情(
bash
):shopt -s nullglob for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done
這使用 shell 字元串替換。您可能不想 glob 沒有
'
其中的文件,因為這mv
會失敗。如果沒有該選項,如果沒有匹配的文件,則將nullglob
傳遞 glob 模式本身。mv
$foo
始終在變數替換和命令替換周圍加上雙引號$(foo)
(除非您知道為什麼需要將它們省略以及為什麼可以這樣做)。for i in *; do mv "$i" "$(echo "$i" | tr -d "'")"; done
這將主要工作,但有一些限制:
- 如果文件名以 開頭,您將得到不良行為或錯誤
-
,因為mv
會將其解釋為一個選項。- 這不會影響名稱以 . 開頭的文件
.
。echo
通過某些設置,這將破壞命令中的反斜杠。- 名稱末尾的換行符失去。
在 ksh93、bash 和 zsh 中,您可以使用該
${VARIABLE//PATTERN/REPLACEMENT}
構造更輕鬆地編寫它。添加--
to處理以 .mv
開頭的文件名-
。如果您的文件名以 開頭.
,請根據需要添加.*
或.[^.]* ..?*
之後*
。for i in *; do mv -- "$i" "${i//\'/}"; done
在 zsh 中,您可以使用
zmv
:zmv '(*)' "\${1//\\'/}"
在 Debian、Ubuntu 和其他衍生產品下,您可以使用
rename
Perl 腳本。rename "s/'//g" *