2017-07-20 25 views
0

我已经编写了一个shell脚本来将文件从源目录移动到目标目录。move命令也在源目录中执行移动

/home/tmp/ to /home/from/

此举发生正确,但它显示消息

mv: /home/tmp/testfile_retry_17072017.TIF 
/home/tmp/testfile_retry_17072017.TIF are identical. 

,如果源目录为空它显示

mv: cannot rename /home/tmp/* to /home/from/* 

文件在/home/tmp/*

if [ -f "$file" ] 
then 
    do 
     DIRPATH=$(dirname "${file}") 
     FILENAME=$(basename "${file}") 
#  echo "Dirpath = ${DIRPATH} Filename = ${FILENAME}" 
     mv "${DIRPATH}/"${FILENAME} /home/from 
     echo ${FILENAME} " moved to from directory" 
    done 
else 
    echo "Directory is empty" 
fi 
+0

为什么不只是'mv $ file/home/from'? '$ DIRPATH/$ FILENAME'与'$ file'相同。 –

回答

0

你有事情有点乱序有:

for file in /home/tmp/* 
if [ -f "$file" ] 
then 
    do 

当然"$file"中会存在 - 你是循环for file in /home/tmp/*。它看起来像你预期

for file in /home/tmp/* 
do 
    FILENAME=$(basename "${file}") 
    if [ ! -f "/home/from/$FILENAME" ] ## if it doesn't already exist in dest 
    then 

注:POSIX外壳包括参数扩展,让您避免调用dirnamebasename。相反,您可以简单地使用"${file##*/}"作为文件名(它只是说从左侧直到(并包括)最后的/)。这是您需要的唯一扩展(因为您已知道目标目录名称)。这允许你检查[ -f "$dest/${f##*/}" ],以确定是否与您已经移动同名的文件中/home/from

存在,您可以用它来你的优势有:

src=/home/tmp   ## source dir 
dst=/home/from   ## destination dir 

for f in "$src"/*  ## for each file in src 
do 
    [ "$f" = "$src/*" ] && break ## src is empty 
    if [ -f "$dst/${f##*/}" ] ## test if it already exists in dst 
    then 
     printf "file '%s' exists in '%s' - forcing mv.\n" "${f##*/}" "$dst" 
     mv -f "$f" "$dst"  ## use -f to overwrite existing 
    else 
     mv "$f" "$dst"   ## regular move otherwise 
    fi 
done 

有用于检查一个很好的资源,你的shell代码叫做ShellCheck.net。只需将您的代码输入网页(或粘贴),它就会分析您的逻辑和变量使用情况,并让您知道哪里出现问题。

看看,让我知道你是否还有其他问题。

+0

嗨感谢您的建议。我关心的不是目标文件。这就是文件不存在于源目录中。脚本定期运行,有时候源目录中没有文件。 –

+0

@asmitathakur - 我添加了一个检查来捕获空的源代码目录,并在那个事件中简单地用'break'退出循环。 –

0

如图所示,您应该使用find而不是/ home/tmp/*。

for file in $(find /home/tmp/ -type f) 
do 
if [ -f "$file" ] 
then 
     DIRPATH=$(dirname "${file}") 
     FILENAME=$(basename "${file}") 
#  echo "Dirpath = ${DIRPATH} Filename = ${FILENAME}" 
     mv "${DIRPATH}/"${FILENAME} /home/from 
     echo ${FILENAME} " moved to from directory" 
else 
    echo "Directory is empty" 
fi 

done 
+0

仍然收到相同的消息 –

+0

我想你在/ tmp目录中有一个名字为'*'的文件名。删除该文件。它应该工作。 –

+0

没有这样的文件。即使目录为空,代码也会将*视为文件名,并且看起来不会出现在其他块中 –