フォルダ1からファイルを検索し、フォルダ2にファイルがない場合はスクリプトを実行します。

フォルダ1からファイルを検索し、フォルダ2にファイルがない場合はスクリプトを実行します。

folder1ファイルのみが.flv含まれます。

folder2ファイルのみが.mp4含まれます。

のすべてのファイルには、次に終わるファイルが.flv必要です。folder1.mp4folder2

/folder1/123.flvそして/folder2/123.mp4

.flv欠落しているスクリプトを見つけてその.mp4スクリプトを生成するには、mencoderを実行するスクリプトが必要です.mp4。ベストを尽くしてこう思い出しましたが、まだIF THEN文に閉じ込められています。

for i in `find /folder1 -type f -iname '*.flv' -printf "%f\n" | 
    sed 's/.flv//g'` ; do 
    if [[ -n $(find /folder2/$i.mp4 -exec grep \-q 0 {} \;) ]] then
        /scripts/script.sh $i  fi ; done

Bashスクリプトは次のように実行する必要があります。

/scripts/script.sh $i 

したがって、ファイル名に拡張子はありません。

ベストアンサー1

この試み:

find folder1 -type f -iname '*.flv' -exec bash -c \
    'f=${1#folder1/}; [ -f "folder2/${f%.flv}.mp4" ] || 
     scripts/script.sh "${1%.flv}"' none {} \;

これは、名前にスペースやその他の難しい文字を含むファイルに適用されます。

どのように動作しますか?

  • find folder1 -type f -iname '*.flv'

    flvファイルを探します。

  • -exec bash -c '...'

    見つかった各 flv ファイルに対して、これは引用符で囲まれたスクリプトを実行する bash を実行するように find に指示します (下記参照)。

  • f=${1#folder1/}

    fこれにより、flvファイル名を使用しますが先行ディレクトリにはない変数が作成されます。

  • [ -f "folder2/${f%.flv}.mp4" ]

    対応するmp4ファイルが存在するかどうかをテストします。

  • ||

    これは、前のコマンドがfalseを返す場合(つまり、対応するmp4ファイルが見つからない場合)にのみ、bashに次のコマンドを実行するように指示します。

  • scripts/script.sh "${1%.flv}"'

    これにより、mp4ファイルが見つからないflvファイルに対してスクリプトが実行されます。このセクションは提供されたファイルscript.shから削除されました.flv

  • none {}

    noneこれはbashに文字列を割り当て$0(このプレースホルダは使用されません)で、見つかったファイル名find(で示されている{})をシェル変数に割り当てるように指示します$1

  • \;

    これはfindコマンドの終わりを示します-exec

おすすめ記事