Bash

如何批量清理包含無效字元的文件名

  • February 4, 2014

我有一個較大的目錄,其中包含文件名包含特殊字元(例如換行符)的文件。這些字元的起源似乎是我將 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:]]}'

這將刪除在您的語言環境中不可列印的字元。

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