3

このコマンドを使用して、現在のディレクトリで .mp3 を含むすべてのディレクトリを検索し、ディレクトリ名のみを除外しました。

find . -iname "*.mp3" | sed -e 's!/[^/]*$!!' -e 's!^\./!!' | sort -u

私は今、反対のことを望んでいますが、少し難しいと感じました. 「!」を追加することはできません。.mp3 を含まないディレクトリが見つからない場合は、印刷時に .mp3 のみが除外されるため、find コマンドに追加します。

これをググって、stackoverflow と unix.stackexchange.com を検索しました。これまでにこのスクリプトを試してみましたが、次のエラーが返されます。

#!/bin/bash

find . -type d | while read dir
do
if [[! -f $dir/*.mp3 ]]
then
    echo $dir
fi
done

/home/user/bin/try.sh: 5行目: [[!: コマンドが見つかりません

#!/bin/bash

find . -type d | while read dir
do
if [! -f $dir/*.mp3 ]
then
    echo $dir
fi
done

/home/user/bin/try.sh: 5行目: [!: コマンドが見つかりません

#!/bin/bash

find . -type d | while read dir
do
if [[! -f "$dir/*.mp3" ]]
then
    echo $dir
fi
done

/home/user/bin/try.sh: 5行目: [!: コマンドが見つかりません

テストコマンドの複数の引数に関係していると思います。

変数が変更されるすべてのディレクトリをテストしているので、ファイル名にワイルドカードを使用します。

どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

3
[ "$(echo $dir/*.mp3)" = "$dir/*.mp3" ]

動作するはずです。

または、「[」と「!」の間にスペースを追加するだけです。

おそらく大幅に高速な方法は

if find "$dir" -name '*.mp3' -quit ; then
  : # there are mp3-files in there.
else
  ; # no mp3:s
fi
于 2012-10-13T14:07:16.310 に答える
1

さて、私はカウンターを使って自分の答えを解決しました。

効果のほどはわかりませんが、効果はあります。私はそれがより良くできることを知っています。気軽に批評してください。

find . -type d | while read dir
do
count=`ls -1 "$dir"/*.mp3 2>/dev/null | wc -l`
    if [ $count = 0 ]
    then
        echo $dir
    fi
done

これにより、MP3 を含まないすべてのディレクトリが出力されます。ディレクトリを再帰的に出力する find コマンドのおかげで、サブディレクトリも表示されます。

于 2012-10-15T16:34:30.747 に答える
0

MP3 コレクションのカバー アートを自動的にダウンロードするスクリプトを実行しました。アートを取得できる各アルバムのディレクトリに「cover.jpg」というファイルを配置しました。スクリプトが失敗したアルバム、つまり、cover.jpg というファイルが含まれていない CD (ディレクトリ) を確認する必要がありました。これは私の努力でした:

find . -maxdepth 1 -mindepth 1 -type d | while read dir; do [[ ! -f $dir/cover.jpg ]] && echo "$dir has no cover art"; done

maxdepth 1 は、私の WD My Cloud NAS サーバーがアルバムごとに作成し、デフォルトの汎用ディスク イメージを配置した隠しディレクトリに検索コマンドが下がらないようにします。(これは次のスキャン中にクリアされました。)

編集: cd で MP3 ディレクトリに移動し、そこから実行するか、. 上記のコマンドで、それを指すパスに。

于 2014-07-30T16:48:26.260 に答える