EXT4でフォーマットされたHDDにGB相当の音楽があります。これらのファイルをFATフォーマットのHDDパーティションに移動したいと思います。ただし、ほとんどのファイルは名前に「:」が含まれているため移動できません(たとえば、オペラの場合は「Act 2:.....」)。コマンドラインですべてのファイルの名前を「XXXX:XXXX」から「XXXX-XXXX」に変更する方法はありますか?
EXT4でフォーマットされたHDDにGB相当の音楽があります。これらのファイルをFATフォーマットのHDDパーティションに移動したいと思います。ただし、ほとんどのファイルは名前に「:」が含まれているため移動できません(たとえば、オペラの場合は「Act 2:.....」)。コマンドラインですべてのファイルの名前を「XXXX:XXXX」から「XXXX-XXXX」に変更する方法はありますか?
回答:
すべてのファイルが1つのディレクトリにある場合は、次のことを試してください。
rename 's|:|-|g' *
(必要に応じて*をより制限的なものに変更できます)
ディレクトリツリーに多くのファイルがある場合は、ツリーのベースからこれを試してください:
find . -name "*:*" -exec rename 's|:|-|g' {} \;
-n
直後にオプションを追加して、rename
実際にそれを行わなくても、それが何をするかを知らせることができます。これは、誤って他のファイルを踏んだり、何か他の悪いことをしたりするのを防ぐのに役立ちます...
find . -type d -readable -writable -exec rename 's|:|-|g' {} \;
ファイル:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;
for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done
。20をdirの最大深度に変更します。構造。正確である必要はありません-大きくすることもできます。ただし、非常に大きな数に設定すると時間がかかります。
これは、ファイルが必ずしも同じディレクトリにない場合を処理するpythonのソリューションです。
import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
for dirname in dirs:
if ':' in dirname:
torename.append(os.path.join(path, dirname))
for filename in files:
if ':' in filename:
torename.append(os.path.join(path, filename))
print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
torename.reverse()
for oldname in torename:
directory, filename = os.path.split(oldname)
newname = os.path.join(directory, filename.replace(':', '-'))
command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
os.system(command)
f = open(logfile, 'a')
f.write(oldname + '\n')
f.close()
else:
print "Aborted."
rootdir
検討中の一番外側のディレクトリに(許可〜のような使用の完全なパス名が/で始まる。ありません速記やENV変数)。特殊文字の前に\を付ける必要はありません。たとえば、最外部のディレクトリが/.../My HDDの場合は、rootdir = "/.../My HDD"
NOTを入れますrootdir = "/.../My\ HDD"
( "s"に注意してください)[Pythonに慣れていない可能性があるため、私はこれを明示的に示しています。軽視しないでください。意図されました。]logfile
ログファイルの目的の場所に変更します。最後に、このファイルには名前が変更されたファイルのリストが含まれます-将来の参照用です。python rename.py
ます。警告:GBの音楽全体を危険にさらす前に、小さなサンプルでテストしてください。
詳細:名前の変更は、最も内側のファイルから外側に向かって行われます。
これは非常に古い投稿だと思います。AeroGT80の再帰的ソリューションは非常に徹底的ですが、かなり低速です。遅いサーバーで約30分実行しましたが、半分しか完了しませんでした。約300のサブディレクトリにある約73,000のファイルでした。
以下のソリューションは、はるかに速く動作します(AeroGT80の非再帰的ソリューションを使用して、ファイルごとにではなく、ディレクトリ内のすべてのファイルに対して動作します)。唯一の問題は、1つのディレクトリの深さまでしか下がらないことです(そのため、彼のソリューションのように完全に再帰的ではありません)。ただし、十分簡単に変更できると確信しています。
#!/bin/bash
for D in *; do
if [ -d "${D}" ]; then
#echo "${D}"
pushd "${D}" > /dev/null
rename 's|:|-|g' *
popd > /dev/null
fi
done
find .
、サブディレクトリの名前の出力がその内容の前にあるためです。したがって、/1:/2:
最初/1:/
にファイルがある場合、名前はに変更され/1-/
ます。は存在しないため、名前/1:/2:
を変更できません。/1-/2-
/1:/2: