我在原始命名方案中拥有大约 2000 个文件。
我需要将它们全部取出,将前 4 个字符移动到扩展名之前的文件名末尾,然后在前 4 个字符之前添加一个空格。
基本上来自:
0123 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).jpg
到
[UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL) 0123.jpg
答案1
这应该有效:
rename -n 's/^([0-9]+) (.*)\.jpg/$2 $1.jpg/' /path/to/files/*.jpg
样本:
0324 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt
0123 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt
0124 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt
结果:
rename(0123 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt, [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL) 0123.txt)
rename(0124 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt, [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL) 0124.txt)
rename(0324 [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL).txt, [UNKNOWN] (Final Fantasy 9) headshot of Freya Crescent {sketch} (ORIGINAL) 0324.txt)
笔记:经过.txt
文件测试,也适用于 jpg 文件名
信息:
([0-9]+)
:选择前面的数字。
(.*)
:选择所有其他内容,直到文件扩展名。
$2 $1.txt
:返回捕获的组,返回的组放置在numbers
靠近文件扩展名的位置jpg
,并在数字前添加一个空格。
-n
:运行时不改变文件名,这样我们就能看到哪些文件被改变了,以及名称改成了什么,删除它就可以重命名文件。
答案2
使用find
和Shell Parameter Expansion
:
- 如果你没有
rename
已安装(但很可能它已经作为 Perl 包的一部分安装)。 - 您可以对所有或指定的匹配文件执行模式仅限“*.jpg”。
- 它就像
find
大自然一样,是递归的。
find . -type f -execdir \
sh -c 'X="[${1#*[}"; Y="${1%% *}";
echo mv -v "$1" "${X%.*} ${Y#./}.${X##*.}"' find-sh '{}' \;
解释:
X="[${1#*[}"
(cut-up-to-first-prefix):这将删除第一次[
看到的所有内容,并将其附加[
回模式。Y="${1%% *}"
(cut-up-to-last-suffix):这将删除从文件名末尾到文件名开头的所有内容,直到看到的最后一个空格;这将导致./PATTERN
例如这样的结果./0123
。${X%.*}
(cut-up-to-first-suffix):这将删除后缀(例如:).jpg
。Y="${Y#./}"
(cut-up-to-first-prefix):这./
将从变量中删除Y
,并且只会从0123
现在的第二步产生 PATTERN。.${X##*.}"
(cut-up-to-last-prefix):这将删除从.
文件名开头到结尾的所有内容,直到最后一个点开始,然后附加一个点.
;这将导致现在.PATTERN
的结果.jpg
。-execdir
这里用来不通过find
命令导致文件路径,并且可以安全地保存/路径/到/文件/.这将产生提示当前目录是否在你的小路或者如果它包含不安全的相对路径。echo
用于试运行,将其删除即可进行实际重命名。