기존 파일에 대한 검색 결과에 "해당 파일 없음"이 표시되는 이유는 무엇입니까?

기존 파일에 대한 검색 결과에 "해당 파일 없음"이 표시되는 이유는 무엇입니까?

이것은 사소한 문제이지만 약간 짜증나는 문제입니다. 계속 살펴봤지만 왜 이런 일이 발생하는지, 어떻게 중지하는지 잘 이해가 되지 않습니다. 나는 수천 개의 비디오 파일을 가지고 있으며 여러 가지 이유로 천천히 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

나는 renamemv명령을 시도했지만 동일한 결과를 얻었습니다. 혼란스러워요. 첫째, 명령이 오류를 보고하는 방법/이유는 무엇입니까 find? find 명령은 .jpg 또는 .txt 파일이 아닌 .mpg 파일에 대해 실행됩니다. 더 중요한 것은 오류가 발생하는 이유는 무엇입니까? 보고된 파일이 존재하며 mv /rename 명령이 해당 파일을 올바르게 처리하고 있습니다. 그뿐만 아니라 이름을 바꾸기 전에 스크립트가 실제로 존재하는지 확인하기도 합니다. 내가 무엇을 놓치고 있나요? .mpg 파일에 대해 스크립트를 수동으로 실행하면 스크립트가 오류 없이 완벽하게 실행됩니다.

답변1

find디렉터리 항목 목록을 읽고 하나씩 처리합니다. 기준과 일치하는 각 항목에 대해 -exec쉘 스크립트를 사용합니다.

find그런 다음 스크립트는 파일 이름을 변경하여 아직 처리 중인 디렉터리 항목 목록을 변경합니다. 따라서 find할 일 목록에는 삭제되거나 이름이 변경된 파일 이름이 여전히 남아 있습니다.

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충분할 때도 있습니다 . 쉘 스크립트가 하나가 아닌 여러 인수를 처리할 수 있으면 도움이 됩니다.

관련 정보