Sed
find 和 sed 替換特殊字元
我正在尋找一種簡單的方法來重命名 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
命令與您要重命名的確切文件集匹配,並且您要重命名為“安全”文件名。在不知道文件名中的確切字元的情況下,我只能提供建議,但這裡有兩個。
- 刪除奇怪的字元。這假定角色可以通過
bash
替換來本地處理find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \ bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "${f///}"; done' _ {} + \)
- 只保留已知字元。確保它
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
以將調試轉換為活動語句。