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

Gus*_*ler 3 awk shell-script

我试图编写一个脚本来重命名文件夹中的目录列表。这是一个 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)

Eri*_*ouf 5

你不想-t在你的情况下。这将告诉mv尝试将所需的名称移动到名为$f.

它将扩展为:

mv -t "[2015] Name of the album" "Name of the album - [2015]"
Run Code Online (Sandbox Code Playgroud)

如果没有-t. 因为它被视为$f所有其他参数都应该移动到的目标目录名称。


ter*_*don 5

如果您有权访问perl-renamerename在基于 Debian 的系统上调用,包括 Ubuntu、perl-renameArch 和prename其他系统),您可以执行以下操作:

perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*
Run Code Online (Sandbox Code Playgroud)

解释

  • -n:这使得perl-rename打印它会做什么而不实际重命名任何东西。像这样运行它,如果它看起来像预期的那样工作,请删除它-n以使其实际重命名。
  • s/from/to/: 将替换fromto.
  • s/(\[.*?\])\s*(.*)/$2 - $1/': 在这里,from是第一个[和第一个]( \[.*?\])之间的所有内容。然后是 0 个或多个空白字符 ( \s*),然后是其他所有字符( .*)。围绕patters括号将捕获它们,让我们把它们作为$1$2分别替换的右手边。因此,这会将[ ]( $2)之后的所有内容放在括号 ( $1)之前。
  • ./\[*在当前目录中名称以[.