folder1
ファイルのみが.flv
含まれます。
folder2
ファイルのみが.mp4
含まれます。
のすべてのファイルには、次に終わるファイルが.flv
必要です。folder1
.mp4
folder2
/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
。