単純な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-rename(Ubuntu、Archなどをrename含むDebianベースのシステムから呼び出されます)、次のことができます。perl-renameprename

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

説明する

  • -n:これにより、perl-rename印刷は実際に名前を変更せずに操作を実行できます。このように実行して期待どおりに機能しているように見える場合は、削除して-n実際に名前を変更してください。
  • s/from/to/from:で置き換えられますto
  • s/(\[.*?\])\s*(.*)/$2 - $1/':ここには、from最初[と最初の]()\[.*?\]の間のすべての内容があります。その後、ゼロ個以上の空白文字(\s*)、その他のすべての文字(.*)。パターンの周りの括弧は捕獲$1それら、それぞれを交換の右辺として使用しよう$2。したがって、[ ]()$2以降のすべての内容は$1角括弧()の前に配置されます。
  • ./\[*。で終わる現在のディレクトリの名前について[

答え3

-tEricが説明したように、オプションを削除するとソリューションが機能します。

ファイル名のビットを移動する代わりに変数置換を使用するawk代替ソリューションは次のとおりです。

for name in '['*; do
    tag="${name%% *}"
    title="${name#* }"
    mv "$name" "$title - $tag"
done
  • ${name%% *}最初のスペース$name(スペースを含む)の後ろのすべての内容を削除し、
  • ${name#* }最初のスペースまで含めてすべての項目を削除します。

関連情報