我试图编写一个脚本来重命名文件夹中的目录列表。这是一个 bash 脚本,我仅使用 awk 来完成此任务。
当前形式:
[2015] Name of the album
Run Code Online (Sandbox Code Playgroud)
所需形式:
Name of the album - [2015]
Run Code Online (Sandbox Code Playgroud)
我的脚本:
#! /usr/bin/env bash
for f in \[*; do
mv -t "$f" "$( awk -F '\] ' ' {print $2 " - " $1 "]"}' <<<"$f" )"
done
Run Code Online (Sandbox Code Playgroud)
当我执行上述脚本时,出现以下错误:
mv: cannot stat 'In Dreams [EP] - [1963]': No such file or directory
Run Code Online (Sandbox Code Playgroud)
你不想-t
在你的情况下。这将告诉mv
尝试将所需的名称移动到名为$f
.
它将扩展为:
mv -t "[2015] Name of the album" "Name of the album - [2015]"
Run Code Online (Sandbox Code Playgroud)
如果没有-t
. 因为它被视为$f
所有其他参数都应该移动到的目标目录名称。
如果您有权访问perl-rename
(rename
在基于 Debian 的系统上调用,包括 Ubuntu、perl-rename
Arch 和prename
其他系统),您可以执行以下操作:
perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*
Run Code Online (Sandbox Code Playgroud)
-n
:这使得perl-rename
打印它会做什么而不实际重命名任何东西。像这样运行它,如果它看起来像预期的那样工作,请删除它-n
以使其实际重命名。s/from/to/
: 将替换from
为to
.s/(\[.*?\])\s*(.*)/$2 - $1/'
: 在这里,from
是第一个[
和第一个]
( \[.*?\]
)之间的所有内容。然后是 0 个或多个空白字符 ( \s*
),然后是其他所有字符( .*
)。围绕patters括号将捕获它们,让我们把它们作为$1
与$2
分别替换的右手边。因此,这会将[ ]
( $2
)之后的所有内容放在括号 ( $1
)之前。./\[*
在当前目录中名称以[
.