0

XBMC などの音楽コレクションのアルバム アートと、私自身の OCD ベースの理由を整理しようとしています。これを行うには、音楽コレクション内の各フォルダーをループ処理したいと考えています (musicそのため、 にもファイルがあり$(find . -type d)ます。各フォルダーに jpeg が存在するかどうかを確認します。存在する場合は、コピーされて .jpeg と呼ばれcover.jpgます。jpeg がない場合見つかった場合、フォルダーの名前をリストに追加する必要があります, その後、自分でグーグルを検索します. 私が使用しているコードは以下のとおりです.

#!/bin/bash

IFS=$'\n'

touch missing

cd /cygdrive/d/music

for i in $(find . -type d)
    do cd $i
    if [ -e '*.jpg' ]
    then
        for j in *.jpg
            do cp $j 'cover.jpg'
        done
    else
        cd ..
        $i >> missing
    fi
done

問題点

  1. cd $iディレクトリが存在しないため、常に失敗します。
  2. $i >> missing許可が拒否されたというエラーで常に失敗しますがls -l missing-rwxrwxrwx+ 1 Username None 0 Sep 13 16:45 missing

アップデート:

スクリプトを機能させるために何度か試行錯誤した後、あきらめてこのAlbum Art Downloaderを使用する必要がありました。どこかにあることがわかっているソリューションに近づくことができたので、改訂されたスクリプトで回答を承認済みとしてマークしています。

4

2 に答える 2

1

cd $i「アーティスト名 - 曲名.mp3」のようなファイルでは失敗します。シェルはそれをArtist Name空白などに分割し、壊れます。$iを実行する前に印刷してcd、問題をデバッグできます。

$i >> missing$iスクリプトとして実行し、内容を行方不明に出力しようとしているため、失敗します。ファイル名を入れたい場合は、 のようなものを使用する必要がありますecho "$i" >> missing

これをシェルで行うのではなく、Perl や Python などの実際のスクリプト言語を使用することをお勧めします。名前にスペースが含まれるファイルは本当に面倒です。

于 2012-09-13T16:03:56.860 に答える
1

1) ディレクトリが存在しないため、cd $i は常に失敗します。

の結果はfind . -type -d最初の作業ディレクトリに相対的であるため、次の作業を行う前にベース ディレクトリに戻る必要がありますcd $1。前のディレクトリに戻る簡単な方法は、cd -.

2) $i >> missing は常に失敗し、permission is denied エラーが発生します。

ここで 2 つの問題があります。まず第一に、$i >> missingあなたは実際に$iコマンドとして実行しようとしています。ファイルにファイル名を追加したい場合は、echo $i >> missing.

次に、最初の作業ディレクトリに作成したため、別の場所に移動すると、実際には別のファイルmissingを扱っています。同じファイルを参照するには、絶対パスを使用します。missingcd

これを試してください:(スクリプトをできるだけあなたが持っているものに近づけようとし、変更した行にコメントしました。また、スペースを含むファイル名をより適切に処理するためにすべてのパスを引用しました)

#!/bin/bash
IFS=$'\n'
MISSING="$(pwd)/missing"  # store absolute path
> "$MISSING". # create new or empty existing

cd /cygdrive/d/music

for i in $(find . -type d)
    do 
    cd "$i"
    if [ -e *.jpg ]  # wildcard not expanded if quoted
    then
        for j in *.jpg
            do cp "$j" 'cover.jpg'
        done
    else
        echo "$i" >> "$MISSING"  # use $MISSING
    fi
    cd -  # go back to previous directory
done

ps 気付いていない場合に備えて*.jpg、ディレクトリに複数のファイルがある場合、スクリプトは基本的に繰り返し上書きcover.jpgし、最後のファイルが実際のバージョンになることに注意してください。cp: 'cover.jpg' and 'cover.jpg' are the same fileまた、複数の jpg ファイルがあり、cover.jpg既に存在する場合、エラー " " が表示される可能性があります。

于 2012-09-13T16:04:13.883 に答える