简单 bash 脚本中的错误 - mv + awk

简单 bash 脚本中的错误 - mv + awk

我试图编写一个脚本来重命名文件夹中的目录列表。这是一个 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-renamerename在基于 Debian 的系统上调用,包括 Ubuntu、perl-renameArch 和prename其他系统),您可以执行以下操作:

perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*

解释

  • -n:这使得perl-renameprint 可以在不实际重命名任何内容的情况下执行它的操作。像这样运行它,如果它看起来像预期的那样工作,请删除-n以使其真正重命名。
  • s/from/to/: 将替换fromto.
  • 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#* }删除第一个空格之前的所有内容(包括空格)。

相关内容