我需要重命名一堆文件(大约 167k),并且每个文件只重命名部分标题。发件人:收件人
Aaaa.bb - 2 tag tag_tag 9tag
Aaaa.bb - 125 tag_tag 9tag
Aaaa.bb - 3567 tag 9tag
:
Aaaa.bb - 000002 tag tag_tag 9tag
Aaaa.bb - 000125 tag_tag 9tag
Aaaa.bb - 003567 tag 9tag
所有内容都在外部硬盘中。有没有什么工具或脚本可以帮助我解决这种情况?另外,我忘了说,我对 ubuntu 和所有那些棘手的东西还不熟悉,所以我会问这个问题以简化答案
答案1
这是我的看法,使用bash
、awk
和mv
。
如果我们从 awk 的角度看文件名,文件名只是一个带有空格分隔字段的字符串,特别值得注意的是必须用零填充的字段 $3。下面的脚本正是这样做的。确保将脚本放置在与要重命名的文件相同的目录中并运行它。此外,确保它可以执行chmod 755 renamerScript.sh
演示
testdir:$ ls
Aaaa.bb - 125 tag tag_tag 9tag Aaaa.bb - 2 tag tag_tag 9tag Aaaa.bb - 4207 tag tag_tag 9tag BACKUP/ renamerScript.sh*
testdir:$ ./renamerScript.sh
mkdir: cannot create directory ‘BACKUP’: File exists
cp: omitting directory ‘BACKUP’
renaming Aaaa.bb - 125 tag tag_tag 9tag to Aaaa.bb - 000125 tag tag_tag 9tag
renaming Aaaa.bb - 2 tag tag_tag 9tag to Aaaa.bb - 000002 tag tag_tag 9tag
renaming Aaaa.bb - 4207 tag tag_tag 9tag to Aaaa.bb - 004207 tag tag_tag 9tag
testdir:$ ls
Aaaa.bb - 000002 tag tag_tag 9tag Aaaa.bb - 000125 tag tag_tag 9tag Aaaa.bb - 004207 tag tag_tag 9tag BACKUP/ renamerScript.sh*
脚本
#!/bin/bash
# renamerScript.sh
# Author: Serg Kolo
# Date: Oct 17, 2015
# Purpose : renaming specific files
# Written for: http://askubuntu.com/q/686794/295286
# Make sure you have backup of the files !!!
# comment/uncomment if you do want to do a backup
mkdir BACKUP
cp -t BACKUP *
# This is where the magic happens:
# If we look at filenames from the awk point of view
# "Aaaa.bb - 2 tag tag_tag 9tag" are all really
# space-separated fields. Field #3 is the one we need to edit.
# What we can do is pad it with zeros and then chop off 6
# characters from the end, and store that as new filename
# The rest is just doing mv command from old filename to new
# And also making sure we're operating on files , not directories
# and not renaming the script file,too
for FILENAME in * ;
do
if [ -f "$FILENAME" -a "$FILENAME" != "renamerScript.sh" ]; then
OLDFILENAME="$FILENAME"
NEWFILENAME=$(echo "$FILENAME" | awk '{$3="00000"$3; len=(length($3)-5); $3=(substr($3,len)); print }')
printf "renaming $OLDFILENAME to $NEWFILENAME \n"
mv "$OLDFILENAME" "$NEWFILENAME"
fi
done
答案2
我建议使用 Python 和正则表达式。下面是我编写的脚本示例,它可以更改文件夹和子文件夹中的所有文件。
directoryChosen = (sys.argv[1])
print directoryChosen + " thi is inside dollartohash"
if os.path.isdir(directoryChosen):
for n in os.listdir(directoryChosen):
if not n.startswith('.'):
newname = n.replace('$', '#')
print newname
if newname != n:
path = os.path.join(directoryChosen, n)
print path + " this is path"
target = os.path.join(directoryChosen, newname)
print target + " this is target"
os.rename(path, target)
newdir = directoryChosen.replace('$', '#')
print newdir
if directoryChosen != newdir :
os.rename(directoryChosen, newdir)
如您所见,它将目录作为参数,并将一个符号更改为另一个符号。我相信您可以修改替换部分。
答案3
您可以使用基于 perl 的rename
命令以所需的格式和字段宽度重新打印空格-连字符-空格后的数字序列,例如
rename -vn -- 's/ - (\d+)/sprintf " - %06d", $1/e' *
(-n 标志表示“无操作”,即它只会进行一次空运行来测试表达式:如果/当您确定它正常工作时,请将其删除)。
答案4
尝试pyRenamer批量文件重命名器,使用模式、替换、插入或删除文本重命名文件,甚至手动重命名文件。
它具有以下特点的 GUI 窗口:
- 使用模式重命名文件。搜索并替换以重命名文件。在文件名的任意位置插入和删除字符。大写(将文件名改为大写)。常见替换。手动重命名选定文件。使用元数据重命名图像。使用元数据重命名音乐。来源
安装:sudo apt-get install pyrenamer