rename
を使用すると、ファイル名を一括変更できます。このコマンドですべての+
を削除し、アンダースコアに置き換えることができました。
rename 's/\+/_/g' *
Aのような通常の文字をAに変更できます。
rename 's/a/A/g' *
しかし、私は?
の名前を変更できませんでした。これは、この/\?
とは異なり、この/?
とは異なります。
「」に対処する方法はありますか?ファイル名に?ほとんどのFTPプログラムは、?
でもファイルの名前を変更できません。真夜中の司令官は失敗します。これまでに機能することがわかった唯一の方法は次のとおりです。
mv ?myfile.txt myfile.txt
しかし、このコマンドは十分な柔軟性がありません。すべてのファイルのすべての?
の名前を一括で変更したいと思います。
これはどう:
for filename in *
do
if [ "$filename" == *"?"* ]
then
mv "$filename" "$(echo $filename | tr '?' '-')"
fi
done
またはワンライナーとして:
for filename in *; do mv "$filename" "$(echo $filename | tr '?' '-')" ; done
ただし、問題はファイル名に疑問符が含まれていることではなく、ファイル名にls
が認識できない文字が含まれていることのようです。
醜いですが、Pythonを使用したワンライナーです。
python -c 'import os, re; [os.rename(i, re.sub(r"\?", "-", i)) for i in os.listdir(".")]'
ファイル名のクリーンアップに関しては、おそらくこれはあなたを助けるでしょう:
python -c 'import os, re; [os.rename(i, unicode(i, "utf-8", "ignore")) for i in os.listdir(".")]'
このコードを使用する
for file in ./*;
do
OUT=`echo $file | sed 's/\r//g'`;
mv $file $OUT;
done
どうやら\r
一致?
sedで。
?
charは、一致させるのが難しい場合があります。そして、私はrename
で幸運に恵まれませんでした。エンコーディングの不一致を回避するために、dir
の出力を処理する方が簡単であることがわかりました。
私の場合、?
は\303\202
であることがわかります。 \
を別の\\
でエスケープする必要があります
最後に、すべてのファイルを繰り返し処理します
for i in *; do mv $i $(echo $i | tr \\303\\202 _); done
これはやり過ぎかもしれませんが、この回答で提供されているリンクのbashスクリプトを使用すると、疑問符、改行、マルチバイト文字、スペース、ダッシュ、その他の許容文字を含む任意の文字でファイル名の名前を変更できます。