0

単純な bash スクリプトを作成して、フォーマットが不十分な (xbmc によって検出されない) テレビ番組のファイル名を変更できるようにしようとしています。awk コマンドで出力したいものを出力できましたが、mv コマンドを組み込むことができるようにバッククォート (またはアクセント文字) に入れるとすぐにエラーになります。

私が作業している awk コマンドは次のとおりです (その上に、ディレクトリ内のすべてのファイルを通過する単純な for ループがあります)。

echo $i | awk -F" " '{print $1 "\\ -\\ S0" $3 "E" $5 ".avi"}'

しかし、それに mv コマンドを追加すると、

mv $i `echo $i | awk -F" " '{print $1 "\\ -\\ S0" $3 "E" $5 ".avi"}'`

次のエラーが発生します。

awk: warning: escape sequence `\ ' treated as plain ` '

私の知る限り、 mv コマンドが正しく機能するにはバックスラッシュが必要です。

ファイル名の入力形式は次のとおりです。

Showname Season 1 Episode 01 - Episode Title.avi
Show Name Season 1 Episode 01 - Episode Title.avi

なりたい

Showname - S01E01 - Episode Title.avi
Show Name - S01E01 - Episode Title.avi

エピソードのタイトルが含まれていることをあまり心配していません (すべての余分なフィールドを含める簡単な方法が見つかりませんでした。また、すべてのファイルを移動して名前を付けるために使用する別のプログラムを使用して、そこにタイトルを配置します) . いくつかの番組では、最初の名前に 2 つの単語が含まれているため (つまり番組名の可能性があります)、スクリプトを手動で調整して、さまざまなフィールドを操作できるようにする予定です。

「バッククォート」を使用したときにエラーが発生しないように、awk をファイル名で適切に動作させる方法について何か提案はありますか?

4

3 に答える 3

1

これを試して:

for file in *
do
   set -- $file
   mv -- "$i" "$(printf "%s - %s %sE%s.avi" "$1" "$file" "$3" "$5")"
done

ただし、これは推測です。入力ファイルと出力ファイルの名前が実際にどのように見えるかを示す必要があります。それらを変換するために機能しないコマンドだけではありません!

于 2013-07-06T12:20:57.080 に答える
0

さて、さらに掘り下げていじった後、 mv コマンドのターゲット全体を引用符で囲み、バックスラッシュを削除するだけでよいことがわかりました。

しかし、その後、別の問題が発生しました。mv コマンドのターゲットはディレクトリではないと言っていた。ディレクトリではないことはわかっています...ここでいくつかのファイルの名前を変更しようとしています...(不平、不平)

mv: target 'Showname - S01E01.avi' is not a directory

とにかく、さらにグーグルで調べた後、LinuxQuestions の投稿で、これは明らかにファイル名のスペースが原因であることがわかりました。スクリプトの先頭に次を追加することで、これを修正できました。

IFS='
'

今では、ファイルの名前を適切な命名スキームに変更して、他のプログラム/サービスがそれらを取得して適切に追加できるようにします

于 2013-07-06T06:06:34.480 に答える