web-dev-qa-db-ja.com

ファイル名の疑問符(?)の名前を変更します

renameを使用すると、ファイル名を一括変更できます。このコマンドですべての+を削除し、アンダースコアに置き換えることができました。

rename 's/\+/_/g' * 

Aのような通常の文字をAに変更できます。

rename 's/a/A/g' *

しかし、私は?の名前を変更できませんでした。これは、この/\?とは異なり、この/?とは異なります。

「」に対処する方法はありますか?ファイル名に?ほとんどのFTPプログラムは、?でもファイルの名前を変更できません。真夜中の司令官は失敗します。これまでに機能することがわかった唯一の方法は次のとおりです。

mv ?myfile.txt myfile.txt

しかし、このコマンドは十分な柔軟性がありません。すべてのファイルのすべての?の名前を一括で変更したいと思います。

2
Morton

これはどう:

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が認識できない文字が含まれていることのようです。

6
ForeverWintr

醜いですが、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(".")]'
3

このコードを使用する

for file in ./*;
do
  OUT=`echo $file | sed 's/\r//g'`;
  mv $file $OUT;
done

どうやら\r一致?sedで。

2
E_v2.0

? charは、一致させるのが難しい場合があります。そして、私はrenameで幸運に恵まれませんでした。エンコーディングの不一致を回避するために、dirの出力を処理する方が簡単であることがわかりました。

私の場合、?\303\202であることがわかります。 \を別の\\でエスケープする必要があります

最後に、すべてのファイルを繰り返し処理します

for i in *; do mv $i $(echo $i | tr \\303\\202 _); done
1
0-_-0

これはやり過ぎかもしれませんが、この回答で提供されているリンクのbashスクリプトを使用すると、疑問符、改行、マルチバイト文字、スペース、ダッシュ、その他の許容文字を含む任意の文字でファイル名の名前を変更できます。

https://superuser.com/a/858671/365691

0
A.Danischewski