我试图编写一个脚本来重命名文件夹中的目录列表。这是一个 bash 脚本,我只使用 awk 来完成此任务。
目前的形式:
[2015] Name of the album
所需形式:
Name of the album - [2015]
我的脚本:
#! /usr/bin/env bash
for f in \[*; do
mv -t "$f" "$( awk -F '\] ' ' {print $2 " - " $1 "]"}' <<<"$f" )"
done
当我执行上面的脚本时,出现以下错误:
mv: cannot stat 'In Dreams [EP] - [1963]': No such file or directory
答案1
你不想-t
在你的情况下。这将告诉mv
尝试将所需的名称移动到名为 的目录$f
。
它会扩展到类似:
mv -t "[2015] Name of the album" "Name of the album - [2015]"
如果没有 . ,这可能就是您想要的-t
。它按原样视为$f
目标目录名称,所有其他参数都应移至其中。
答案2
如果您有权访问perl-rename
(rename
在基于 Debian 的系统上调用,包括 Ubuntu、perl-rename
Arch 和prename
其他系统),您可以执行以下操作:
perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*
解释
-n
:这使得perl-rename
print 可以在不实际重命名任何内容的情况下执行它的操作。像这样运行它,如果它看起来像预期的那样工作,请删除-n
以使其真正重命名。s/from/to/
: 将替换from
为to
.s/(\[.*?\])\s*(.*)/$2 - $1/'
:在这里,from
是第一个[
和第一个]
(\[.*?\]
) 之间的所有内容。然后是 0 个或多个空白字符 (\s*
),然后是其他所有字符 (.*
)。模式周围的括号将捕获他们,让我们分别将它们用作$1
替换$2
的右侧。因此,这会将[ ]
($2
) 之后的所有内容放在方括号 ($1
) 之前。./\[*
对当前目录中名称以[
.
答案3
-t
正如埃里克所解释的,如果您删除该选项,您的解决方案就会起作用。
这是使用变量替换而不是awk
移动文件名的位的替代解决方案:
for name in '['*; do
tag="${name%% *}"
title="${name#* }"
mv "$name" "$title - $tag"
done
${name%% *}
删除第一个空格之后的所有内容$name
(包括空格),并且${name#* }
删除第一个空格之前的所有内容(包括空格)。