2014-09-27 78 views
0

我想将所有文件和子目录从一个目录复制到另一个目录。但是,如果它们不在目标目录中,或者如果源目录文件上的时间戳比目标目录上的时间戳更新,我只想复制它们。我有麻烦进入所有的子目录。我能够降低一个级别,但不是下一个级别。例如,使用目录/ a/b/c,我可以到达子目录b,但不能到达c。我能看到这样做的唯一方法是使用递归函数。我的代码如下。Linux bash脚本复制目录和子目录

#!/bin/bash 


SOURCEDIR=/home/kyle/Smaug/csis252 

DESTDIR=/home/kyle/Desktop/csis252 

copy() { 
    local DIRECTORY=$1 
    for FILE in `ls $DIRECTORY` 
    do 
     if [ -f $DIRECTORY/$FILE ] 
     then 
      echo $FILE file 
      cp $DIRECTORY/$FILE $DESTDIR/$DIRECTORY/$FILE 
     fi 
     if [ -d $FILE ] 
     then 
      echo $FILE directory 
      mkdir $DESTDIR/$DIRECTORY/$FILE 
      copy $DIRECTORY/$FILE 
     fi 
     done 
} 


cd $SOURCEDIR 

copy . 

我忘记了第二条if语句中的$ DIRECTORY。我现在觉得很蠢,但有时候只是需要别人阅读才能找到这样的东西。我没有使用cp -r $ SOURCEDIR $ DESTDIR,因为这会复制所有内容,有时我不想要。我尝试了cp -ur $ SOURCEDIR $ DESTDIR,但它只会复制新的东西,而不会更新现有的东西。我的代码的最终版本如下。

#!/bin/bash 

SOURCEDIR=/home/kyle/Smaug/csis252 

DESTDIR=/home/kyle/Desktop/csis252 

copy() { 
    local DIRECTORY=$1 
    for FILE in `ls $DIRECTORY` 
    do 
     if [ ! -f $DESTDIR/$DIRECTORY/$FILE ] && [ ! -d $DESTDIR/$DIRECTORY/$FILE ] 
     then 
     if [ -f $DIRECTORY/$FILE ] 
     then 
      echo "$DIRECTORY/$FILE copied" 
      cp $DIRECTORY/$FILE $DESTDIR/$DIRECTORY/$FILE 
     fi 
     if [ -d $DIRECTORY/$FILE ] 
     then 
      echo "$DIRECTORY/$FILE directory made" 
      mkdir $DESTDIR/$DIRECTORY/$FILE 
      copy $DIRECTORY/$FILE 
     fi 
    else 
     if [ $DESTDIR/$DIRECTORY/$FILE -nt $DIRECTORY/$FILE ] && [ ! -d $DIRECTORY/$FILE ] 
     then 
      cp $DIRECTORY/$FILE $DESTDIR/$DIRECTORY/$FILE 
      echo "$DIRECTORY/$FILE updated" 
     fi 
    fi 
    done 
} 

cd $SOURCEDIR 
copy . 

回答

1
if [ -f $DIRECTORY/$FILE ] 

...

if [ -d $FILE ] 

你在你的-d检查忘记$DIRECTORY/。这对于顶级目录不是问题,因为当DIRECTORY.,[ -d dir ][ -d ./dir ]将始终给出相同的结果,但是对于子目录它确实很重要。

注意:您可能想要查看执行此操作的预先编写的程序。 cp(至少GNU版本)或rsync可能可以避免任何自定义脚本的需要,并且还可以处理比任何脚本更好的特殊文件(特殊文件名称字符或特殊文件类型)。

2
简单

cp -ur $SOURCEDIR $DESTDIR 

-r recursivly拷贝文件夹和子文件夹

-u更新,只复制当源是新

相关问题