シェルでファイル名を再帰的に変更する方法はありますか?

シェルでファイル名を再帰的に変更する方法はありますか?

WordPressサイトからファイルをインポートするには、wgetを実行する必要があります。 [,random-string-text.pagespeed.blah]を使用してすべてのJPGを保存します。

コンマの後のすべてのテキストを削除して、これらのJPGの名前を再帰的に変更する方法はありますか?

答え1

目的のタスクを実行するPythonスクリプトは次のとおりです。

#!/usr/bin/env python2
# -*- coding: ascii -*-
"""remove_extensions.py

Remove meta-data filename extensions added by wget.
"""

import sys
import os
import re

# Define a regular expression to match the file-extension pattern
regex = r'^(.*),random-string-text.pagespeed.blah$'

for current_path, subdirectories, files in os.walk(sys.argv[1]):
    for filename in files:
        match = re.match(regex, filename)
        if match:
            newname = match.groups()[0]
            newpath = os.path.join(current_path, newname)
            oldpath = os.path.join(current_path, filename)
            os.rename(oldpath, newpath)

実際のファイル名パターンと一致するように正規表現を少し変更する必要があります(またはそれが何であるかを明示するように質問を更新する必要があります)。

以下は、スクリプトが実際に動作する様子を示すテストです。

いくつかのディレクトリを作成します。

mkdir /tmp/dir1
mkdir /tmp/dir1/dir2
mkdir /tmp/dir3

いくつかのファイルで記入してください。

touch /tmp/dir1/file{01..03}.jpg,random-string-text.pagespeed.blah
touch /tmp/dir1/dir2/file{04..06}.jpg,random-string-text.pagespeed.blah
touch /tmp/dir3/file{07..10}.jpg,random-string-text.pagespeed.blah

私たちがしたことを確認するには:

user@host:~$ tree /tmp

/tmp/
├── dir1
│   ├── dir2
│   │   ├── file04.jpg,random-string-text.pagespeed.blah
│   │   ├── file05.jpg,random-string-text.pagespeed.blah
│   │   └── file06.jpg,random-string-text.pagespeed.blah
│   ├── file01.jpg,random-string-text.pagespeed.blah
│   ├── file02.jpg,random-string-text.pagespeed.blah
│   └── file03.jpg,random-string-text.pagespeed.blah
└── dir3
    ├── file07.jpg,random-string-text.pagespeed.blah
    ├── file08.jpg,random-string-text.pagespeed.blah
    ├── file09.jpg,random-string-text.pagespeed.blah
    └── file10.jpg,random-string-text.pagespeed.blah

3 directories, 10 files

次にスクリプトを実行します。

python remove_extensions.py /tmp/

最後に、目的の効果があることを確認してください。

user@host:~$ tree /tmp/
/tmp/
├── dir1
│   ├── dir2
│   │   ├── file04.jpg
│   │   ├── file05.jpg
│   │   └── file06.jpg
│   ├── file01.jpg
│   ├── file02.jpg
│   └── file03.jpg
└── dir3
    ├── file07.jpg
    ├── file08.jpg
    ├── file09.jpg
    └── file10.jpg

3 directories, 10 files

答え2

ファイル名に他のカンマがないと確信している場合は、次のことを試すことができます。

for i in `find . -type f` ; do mv $i $(echo $i | sed 's/\(.*\),.*/\1/g') ; done

関連情報