Bash
如何批量清理包含無效字元的文件名
我有一個較大的目錄,其中包含文件名包含特殊字元(例如換行符)的文件。這些字元的起源似乎是我將 pdf 文件(標題和作者姓名)中的文本複制並粘貼到 pdf 閱讀器的“另存為”對話框中,而忽略了它們包含這些無效字元。使用
ls
文件管理器或文件管理器時,我看不到特殊字元,但它們的存在阻礙了我複製或重命名它們。那麼如何遞歸重命名刪除所有無效字元的文件?請注意,我不想刪除正常的 utf8 字元,例如變音符號、空格等。
perl 方式:
#!/usr/bin/perl opendir(DIR,".") or die "$@:$!"; while ($in = readdir(DIR)) { next unless -f $in; ($out = $in) =~ s/[^a-zA-Z0-9._-]//g; warn "$@:$!" unless rename $in, $out; } closedir(DIR);
正則表達式僅過濾 a-zA-Z …(也可以是
$$ :print: $$對於可列印的字元)作為有效字元。不檢查空目標名稱。
與
zsh
:autoload zmv zmv -n '(**/)(*)' '$1${2//[^[:print:]]}'
-n
(開心時去掉)。如果要包含隱藏文件(並查看隱藏目錄):zmv -Qn '(**/)(*)(D)' '$1${2//[^[:print:]]}'
這將刪除在您的語言環境中不可列印的字元。