web-dev-qa-db-ja.com

ディレクトリ内のファイル拡張子を変更する方法

拡張子を持つディレクトリに多くのファイルがあります。

.text(2)
.text(1)

拡張機能から数字を削除したいので、出力は次のようになります

.text 
.text

誰でもそのためのシェルスクリプトを手伝ってくれますか?私はCentOs 6.3を使用しています。

4
vishal

ファイルが保存されているフォルダーでワンライナーを起動するか、findコマンドのパスを変更します。次の例では、find .パスは.(ドット)です。

でテストする:

find . -type f -print0 | xargs -I{} -0 rename -v -n  's/\([0-9]+\)$//' {}

次の名前に変更:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}

このコマンドは、すべてのファイルを再帰的に検索し、ファイル名の最後にあるすべての(<any_number>)を削除します。

's/\([0-9]+\)$//'$を削除して、ファイル名のどこかにあるすべての出現を削除します。例:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)//' {}

例:

% ls -oga
-rw-rw-r--  1 0 Jun 10 09:34 .foo(1)
-rw-rw-r--  1  0 Jun 10 09:34 .bar(2)
% find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}
% ls -aog
-rw-rw-r--  1    0 Jun 10 09:34 .foo
-rw-rw-r--  1    0 Jun 10 09:34 .bar
9
A.B.
for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done 

必要に応じて拡張子(.textまたはその他の拡張子)を変更するだけです。

0
vishal

pythonを使用:

#!/usr/bin/env python2
import os, re
for root, dirs, files in os.walk('/path/to/directory'):
    for f in files:
        oldname = os.path.join(root, f)
        newname = os.path.join(root, re.search(r'(?<=/)[^/]+(?=\(\d+\)$)', oldname).group())
        os.rename(oldname, newname)

ファイル名の最初の部分を考慮することは(既に述べたように)異なるため、上書きする可能性はありません。

  • os.walkは、指定されたディレクトリの下のすべてのサブディレクトリを走査します

  • oldnameには、変更するファイルの名前が含まれます。 os.path.joinは、os.path.joinによってディレクトリパスにファイル名を追加します

  • newnameには、oldnameが変更される名前が含まれます。ここでは、reモジュールを使用してファイル名を取得し、os.path.joinによってディレクトリへのパスにファイル名を追加しました

  • os.renameは単にファイルの名前を適宜変更します。

前:

foo
├── 1 spam.text(1)
├── 1.text(23)
└── bar
    ├── 1 Egg.text(10)
    └── 3test.text(5)

後:

foo
├── 1 spam.text
├── 1.text
└── bar
    ├── 1 Egg.text
    └── 3test.text
0
heemayl