복사 상태에 따라 디렉터리의 파일을 구별하는 옵션/명령이 있습니까?

복사 상태에 따라 디렉터리의 파일을 구별하는 옵션/명령이 있습니까?

디렉터리의 파일이 디렉터리의 다른 응용 프로그램에서 복사/로드되는 상태인지 확인하는 다음 코드가 있습니다.

암호:

for file in PATH/*
do

    lsofresult=`lsof | grep $file | wc -l`
    while [ $lsofresult != 0 ]; do 
        echo "still copying file $file..."
        sleep 1
        lsofresult=`lsof | grep $file | wc -l`
    done
done

루프의 반환 코드는 추가 논리에 사용됩니다. 그러나 파일이 디렉터리에 계속 들어가면 루프가 계속됩니다. 하지만 다른 응용 프로그램에서 디렉터리로 복사한 파일을 처리하고 싶습니다.

그래서 이상적으로는 1개의 파일이 복사가 완료된 디렉터리에 2개의 파일이 복사되는 경우, 복사가 완료되는 대로 완성된 파일을 처리하고, 복사된 상태의 다른 파일을 한번 작업해 주면 좋겠다는 생각입니다. 완료되었습니다. 디렉터리에 복사된 파일과 복사되는 파일을 구별할 수 있는 옵션이 있습니까? 그렇다면 누구든지 도와줄 수 있나요?

답변1

내가 당신을 올바르게 이해했다면 당신의 생각에는 논리적 오류가 있습니다. 다른 파일이 아직 복사되는 동안 한 파일의 복사가 완료되었는지 확인하려고 합니다. 여태까지는 그런대로 잘됐다.

하지만 내 생각에는 당신이 당신과 비슷한 것을 사용하고 있는 것 같아요 for PATH/*. 아마도요 cp path/* destination/*? - 명령이 파일을 하나씩 복사하도록 하지만 동시에 백그라운드에서 모든 파일을 동시에 확인하여 cp 명령이 실행 중인지 확인하고, 그렇지 않은 경우 해당 파일에 대해 다른 작업을 수행하려고 합니다. . cp가 아직 파일을 복사하지 않았는지 어떻게 확인합니까? 적어도 둘 다 확인하려는 경우에는 psof와 작동하지 않습니다.

실제로 수행하는 작업은 파일이 대상에 이미 존재하고 원본 파일과 동일한 해시를 가지고 있는지 확인하는 것입니다. 그래야만 파일이 성공적으로 복사되었는지 확인할 수 있습니다.

이를 통해 목표가 무엇인지, 현재 스크립트가 원하는 대로 작동하지 않는 이유에 대한 더 나은 아이디어를 얻을 수 있습니다.

아쉽게도 이번 리뷰는 좀 깁니다.

나는 실제로 앉아서 당신이 설명하는 내용에 사용할 수 있는 스크립트를 만들었습니다. 최적화되었는지는 확실하지 않지만 적어도 복사가 진행되는 동안 검사가 실행되고 복사가 완료된 후에도 계속해서 작업을 수행합니다.

#! /bin/bash
SOURCEPATH="/path/to/sourcefiles"
DESTINATION="/path/to/destination"
FILES=`find $SOURCEPATH -type f`

function copy {

cp $SOURCEPATH/* $DESTINATION

}

function nextfunction {
#Could also do something else with the file already
echo "Done copying" $1
}


function check {
#Output so we see that the checks run simultaniously
echo "original path variable:" $1
echo "filename:" ${1##*/}

hashOfInputFile=`md5sum $1 | cut -d" " -f1`

#make sure the file actually exists before trying to create a hashsum
while [ ! -f $DESTINATION/${1##*/} ]; do 
sleep 5
done

#create a first hashsum to check if the file is completly copied
hashOfCopiedFile=`md5sum $DESTINATION/${1##*/} | cut -d" " -f1`

#check if the hashsums are the same if not wait a little and create a new one
while [ "$hashOfInputFile" != "$hashOfCopiedFile" ]; do
sleep 5
hashOfCopiedFile=`md5sum $DESTINATION/${1##*/} | cut -d" " -f1`
done

#proceed to do something else with the source file 
nextfunction $1
}

#put the copy in the background so we can proceed with the script
copy &

for file in $FILES 
do
#checks are also put in the background so the script continues
check $file &
done

관련 정보