Linux bash脚本用于复制目录和子目录

时间:2014-09-27 18:57:29

标签: copy subdirectory

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

#!/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 .

2 个答案:

答案 0 :(得分:3)

更简单就是

cp -ur $SOURCEDIR $DESTDIR

-r递归复制文件夹和子文件夹

-u更新,仅在来源较新时复制

答案 1 :(得分:1)

if [ -f $DIRECTORY/$FILE ]
     

...

if [ -d $FILE ]

您在$DIRECTORY/支票中忘记了-d。这对于顶级目录来说不是问题,因为当DIRECTORY.时,[ -d dir ][ -d ./dir ]将始终给出相同的结果,但对于子目录而言很重要。

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