既存のファイルの検索結果に「該当ファイルなし」が表示されるのはなぜですか?

既存のファイルの検索結果に「該当ファイルなし」が表示されるのはなぜですか?

これはマイナーな問題ですが、少し迷惑な問題です。ずっと見てきましたが、なぜこのようなことが起こるのか、どうやって停止するのかよく理解できません。私は何千ものビデオファイルを持っており、いくつかの理由でゆっくりとMPEG II形式からMP4コンテナのh.264形式に変換しています。各.mpgファイルには.txtファイルと.jpgファイルが関連付けられており、これらのファイルを「xxxxxxxxxxxxxxx.mpg.txtとxxxxxxxxxxxxxxx.mpg.jpgからxxxxxxxxxxxxxxx.mp4.txtとxxxxxxxxxxxxxxx.mp4.jpg」に変更する必要があります。その後、古い.mpgファイルを削除する必要があります。 mpgscan.shという名前の次のスクリプトを使用してこれを行います。

#! /bin/bash

suffix=".mpg"
mpegname="$@"
filename=${mpegname%"$suffix"}
mp4name="$filename"".mp4"
if [ -s "$mp4name" ]
then
    if lsof "$mp4name" > /dev/null || lsof "$mpegname" > /dev/null
    then
        echo "$filename in use"
    else
        if [[ -f "$mpegname"".txt" ]]
        then
            rename -f 's/\.mpg.txt$/.mp4.txt/' "$mpegname"".txt"
        fi
        if [[ -f "$mpegname"".jpg" ]] 
        then
            rename -f 's/\.mpg.jpg$/.mp4.jpg/' "$mpegname"".jpg"
        fi
        echo "$filename removed"
        rm "$mpegname"
    fi
fi

ファイル変換はバックグラウンドで行われるため、時々次のように入力して関連ファイルを一括更新します。

find /RAID/Recordings -name "*.mpg" -exec mpegscan.sh {} \;

うまくいきますが、次のような期待される結果は得られません。

/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD) removed
/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H) removed
/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD) removed
/RAID/Recordings/Movies/K/King Ralph (Recorded Wed Jul 16, 2008, HBOHD) in use

私は得る:

/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD) removed
find: '/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H) removed
find: '/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD) removed
find: '/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/King Ralph (Recorded Wed Jul 16, 2008, HBOHD) in use

私はrenameコマンドmvを試しましたが、同じ結果を得ました。混乱しています。まず、コマンドがエラーを報告する方法/理由は何ですかfind? find コマンドは、.jpg または .txt ファイルではなく、.mpg ファイルに対して実行されます。さらに重要なのは、エラーが発生するのはなぜですか?報告されたファイルが存在し、mv /rename コマンドがそのファイルを正しく処理しています。それだけでなく、名前を変更する前にスクリプトが実際に存在することを確認することもあります。私は何を見逃していますか? .mpgファイルに対してスクリプトを手動で実行すると、スクリプトはエラーなしで完全に実行されます。

答え1

findディレクトリエントリのリストを読み取り、1つずつ処理します。条件に一致する各項目に対して-execシェルスクリプトを使用します。

findその後、スクリプトはファイル名を変更して、まだ処理中のディレクトリエントリのリストを変更します。そのため、findToDoリストには削除または名前変更されたファイル名が残っています。

find処理しようとすると、ファイルがもう存在しないと文句を言います。

例:

# create files in random order
$ shuf -e {a..z} {a..z}.foo {a..z}.bar | xargs touch

# rename using find -exec mv
$ busybox find -name "[a-z]" -exec mv {}.foo {}.baz \;
find: ./i.foo: No such file or directory
find: ./t.foo: No such file or directory
find: ./d.foo: No such file or directory
...

busybox findGNU findutilsはfindすでにこの状況を処理するのに十分賢いので、ここでそれを使用しています。以前のバージョンを使用しているか、ビジボックスバリアント(ある種のNASに組み込まれているシェルの場合)を使用している可能性があります。

条件によって欠落しているファイルが無視される場合は、このエラーを無視することもできます。または、まずファイルリストを作成してからリストを処理するようにしてください。

時には、パターンのfind -print0 | xargs -0代わりにパターンを使用するだけでfind -exec十分です。シェルスクリプトが1つではなく複数の引数を処理できる場合に役立ちます。

関連情報