我想将所有文件和子目录从一个目录复制到另一个目录。但是,如果它们不在目标目录中,或者如果源目录文件上的时间戳比目标目录上的时间戳更新,我只想复制它们。我有麻烦进入所有的子目录。我能够降低一个级别,但不是下一个级别。例如,使用目录/ 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 .