私のディレクトリとサブディレクトリの複数のファイルには、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)