쉘에서 파일 이름을 재귀적으로 변경하는 방법이 있습니까?

쉘에서 파일 이름을 재귀적으로 변경하는 방법이 있습니까?

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

관련 정보