ファイル名のすべてのコロンをターミナルに置き換えます


12

EXT4でフォーマットされたHDDにGB相当の音楽があります。これらのファイルをFATフォーマットのHDDパーティションに移動したいと思います。ただし、ほとんどのファイルは名前に「:」が含まれているため移動できません(たとえば、オペラの場合は「Act 2:.....」)。コマンドラインですべてのファイルの名前を「XXXX:XXXX」から「XXXX-XXXX」に変更する方法はありますか?

回答:


25

すべてのファイルが1つのディレクトリにある場合は、次のことを試してください。

rename 's|:|-|g' *

(必要に応じて*をより制限的なものに変更できます)

ディレクトリツリーに多くのファイルがある場合は、ツリーのベースからこれを試してください:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

-n直後にオプションを追加して、rename実際にそれを行わなくても、それが何をするかを知らせることができます。これは、誤って他のファイルを踏んだり、何か他の悪いことをしたりするのを防ぐのに役立ちます...


1
単一ディレクトリソリューションは機能しますが、ディレクトリ自体の名前に:sがある場合、ネストされたソリューションは機能しません。これはfind .、サブディレクトリの名前の出力がその内容の前にあるためです。したがって、/1:/2:最初/1:/にファイルがある場合、名前はに変更され/1-/ます。は存在しないため、名前/1:/2:を変更できません。/1-/2-/1:/2:
S Prasanth

1
ディレクトリの場合:find . -type d -readable -writable -exec rename 's|:|-|g' {} \;ファイル:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;

@Christopher名前に:を含む2つのレベルのディレクトリがある場合、ディレクトリのコマンドは失敗します。例:/ 1:/ 2:/ここで2:もディレクトリです。もちろん、これがライアンの状況に当てはまらない場合は、これでうまくいきます。
S Prasanth

複数レベルのサブディレクトリの場合:を使用しますfor i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done。20をdirの最大深度に変更します。構造。正確である必要はありません-大きくすることもできます。ただし、非常に大きな数に設定すると時間がかかります。
S Prasanth

0

私のLinuxマシンには今はいないので、大まかな情報しか提供できません。

Linuxには、rename他の入力、正規表現、正規表現などと連携するコマンドラインユーティリティがあります。必要な名前に変更するには、ファイルで「s /:/-/」などの正規表現と一緒に使用できる必要があります。

安全のために、小さなバッチで実行するか、シミュレーションで最初にテストしてください(名前の変更には、実際に名前を変更することなくファイルの古い名前と新しい名前を与えるフラグがあります-これを最初に確認するために使用してください)


0

これは、ファイルが必ずしも同じディレクトリにない場合を処理する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."
  1. これを(たとえば)rename.pyファイルに保存します。
  2. 変更rootdir検討中の一番外側のディレクトリに(許可〜のような使用の完全なパス名が/で始まる。ありません速記やENV変数)。特殊文字の前に\を付ける必要はありません。たとえば、最外部のディレクトリが/.../My HDDの場合は、rootdir = "/.../My HDD"NOTを入れますrootdir = "/.../My\ HDD"( "s"に注意してください)[Pythonに慣れていない可能性があるため、私はこれを明示的に示しています。軽視しないでください。意図されました。]
  3. logfileログファイルの目的の場所に変更します。最後に、このファイルには名前が変更されたファイルのリストが含まれます-将来の参照用です。
  4. を呼び出しpython rename.pyます。

警告:GBの音楽全体を危険にさらす前に、小さなサンプルでテストしてください。

詳細:名前の変更は、最も内側のファイルから外側に向かって行われます。


0

これは非常に古い投稿だと思います。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.