Shell

從所有文件名中刪除撇號

  • December 10, 2019

我試圖從目錄中所有文件的名稱中刪除撇號。

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 和其他衍生產品下,您可以使用renamePerl 腳本。

rename "s/'//g" *

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