![有没有办法从 shell 递归地更改文件名?](https://linux22.com/image/123604/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E4%BB%8E%20shell%20%E9%80%92%E5%BD%92%E5%9C%B0%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
必须执行 wget 从 Wordpress 站点获取文件。它用 [,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