2014-09-27 2 views
0

Я хочу скопировать все файлы и подкаталоги из каталога в другой каталог. Однако я хочу только скопировать их, если они еще не находятся в целевом каталоге, или если метка времени в файле исходного каталога более новая, чем временная метка в каталоге назначения. У меня возникают проблемы во всех подкаталогах. Я могу подняться на один уровень, но не следующий. Например, с 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 . 

ответ

1
if [ -f $DIRECTORY/$FILE ] 

...

if [ -d $FILE ] 

Вы забыли $DIRECTORY/ в вашем -d проверки. Это не проблема для каталогов верхнего уровня, потому что когда DIRECTORY равно ., [ -d dir ] и [ -d ./dir ] всегда будут давать одинаковый результат, но для подкаталогов это имеет значение.

Примечание: вы можете захотеть просмотреть предварительно написанные программы, которые это сделают. cp (по крайней мере, версия GNU) или rsync, вероятно, могут избежать необходимости в любом пользовательском скрипте, а также обрабатывать специальные файлы (специальные имена файлов или специальные типы файлов) лучше, чем любой скрипт.

2

Simpler будет

cp -ur $SOURCEDIR $DESTDIR 

-r recursivly копирует файлы и папки

-u обновления, копирует только тогда, когда источник новее

Смежные вопросы