ファイル名からすべての特殊文字を再帰的に削除します。

ファイル名からすべての特殊文字を再帰的に削除します。

私のディレクトリとサブディレクトリの複数のファイルには、Microsoftファイル共有とSharePointでサポートされていない特殊文字が含まれています。文字タイプは、チルダからアンパサンドまで、誰が知っているかまで、さまざまです。私は次のコマンドを使用しました。

find . -type f -print | while read file
do
  file_clean=$( echo ${file} | tr " \~()&'" "_____" )
  mv $file $file_clean
done

誰かがglobstarの使用を提案するのを見ました。しかし、すべての特殊文字を削除してAZ、az、0-9のみを再帰的に残す比較的単純なコマンドはまだ見つかりません(再帰が最も難しい部分のようです)。

答え1

最も簡単な方法は扱いにくい。 ZshはデフォルトのOS Xインストールの一部ですが、ほとんどのLinuxディストリビューションのパッケージマネージャと* BSDのポートを介してインストールする必要があります。 Zshは提供しますzmv機能により、多くのファイル名の変更操作が容易になります。最初に実行します(または.zshrcインタラクティブ使用のためにユーザーのコンピュータに配置します)。

autoload zmv

その後利用できます

zmv '(**/)(*)' '$1${2//[^A-Za-z0-9]/_}'

またはそれに対応する

zmv '**/*' '$f:h${${f:t}//[^A-Za-z0-9]/_}'

最初のzmvコマンドは、一致するすべてのファイル(つまり、**/*現在のディレクトリとサブディレクトリのすべてのファイルを再帰的に)の名前を同じディレクトリ(a)$1にある[^A-Za-z0-9]ファイルに置き換え、ファイルのデフォルト名をに割り当てます。 2番目のコマンドは同じことを行いますが、完全な元の名前を引用し、_(**/)(*)/$1$2$f修飾子 :h:t名前のディレクトリと基本部分を抽出します。


さまざまな特殊文字を文字通り処理するのではなく、シェル処理で実行するため、スクリプトはさまざまな方法で中断されます。理由を理解するには、以下をお読みください。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

答え2

すべてのファイル名を取得するには、空の削除文字列に依存する必要があります。

find /your/path/ -print0 | while read -r -d $'\0' filename; do
    dn="`dirname "$filename"`"
    bn="`basename "$filename"`"
    bn_clean="`echo "$bn" | tr " \~()&'" "_______"`"
    file_clean="$dn/$bn_clean"
    if [ "$filename" != "$file_clean" ] ; then
        mv -fv "$filename" "$file_clean"
    fi
done

答え3

次の点に注意してください。

perl -pi -e 's/\W//g' $(find . -type f)

バックアップには次の方法を使用できます。

perl -pi.bak -e 's/\W//g' $(find . -type f)

関連情報