Я хочу скопировать все файлы и подкаталоги из каталога в другой каталог. Однако я хочу только скопировать их, если они еще не находятся в целевом каталоге, или если метка времени в файле исходного каталога более новая, чем временная метка в каталоге назначения. У меня возникают проблемы во всех подкаталогах. Я могу подняться на один уровень, но не следующий. Например, с directory/a/b/c, я могу перейти в подкаталог b, но не в c. Единственный способ, которым я мог это сделать, - это рекурсивная функция. Мой код ниже.Linux bash script для копирования каталога и подкаталогов
#!/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 .
Я забыл $ DIRECTORY во втором утверждении if. Сейчас я чувствую себя глупо, но иногда просто требуется, чтобы кто-то еще прочитал, чтобы найти такие вещи. Я не использовал 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 .