是否有任何选项/命令可以根据目录中文件的复制状态来区分文件?

是否有任何选项/命令可以根据目录中文件的复制状态来区分文件?

我有下面的代码,它检查目录中的文件是否处于从目录中的另一个应用程序复制/加载状态。

代码:

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

循环的返回代码将用于进一步的逻辑。但是,如果文件继续进入目录,则该循环将继续执行。但我想处理已从另一个应用程序复制到目录的文件。

因此,理想的情况是,如果 2 个文件正在复制到 1 个文件已完成复制的目录,我想在复制完成后立即处理已完成的文件,并且处于复制状态的另一个文件需要工作完成后。是否有任何选项可以区分目录中的复制文件和正在复制的文件?如果是这样,有人可以帮忙吗?

答案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

相关内容