Sed

find 和 sed 替換特殊字元

  • October 20, 2021

我正在尋找一種簡單的方法來重命名 Synology NAS 上的許多文件。find 並且sed可用,但不可用rename

我可以得到這些文件和文件夾的列表

find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print

上面的 find 語句顯示所有包含“/”字元的文件,在 Synology bash 中替換為“”。

我需要替換的所有特殊字元是: / \ : ? ' ’ ´ ’

根據所使用的平台和文件共享協議,這些字元的外觀會有所不同,顯示不同或根本不顯示,或者會導致不同類型的問題。我可以在 Synology bash 中找到這些字元: -name "**" -o -name '*\\*' -o -name "*:*" -o -name "*\?*" -o -name "*\'*" -o -name "*´*" -o -name "**"`

如何在它找到的每個文件和目錄中替換這些字元?我將從字元“/”開始。

非常感謝您的幫助!

加里

假設該find命令與您要重命名的確切文件集匹配,並且您要重命名為“安全”文件名。在不知道文件名中的確切字元的情況下,我只能提供建議,但這裡有兩個。

  1. 刪除奇怪的字元。這假定角色可以通過bash替換來本地處理
find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
    bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "${f///}"; done' _ {} + \)
  1. 只保留已知字元。確保它tr具有您要保留的字元集。
find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
    bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "$(tr -cd '[:alnum:][:punct:][:space:]' <<<"$f")"; done' _ {} + \)

在這兩種情況下都刪除echo以將調試轉換為活動語句。

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