2014-09-27 147 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更新,只複製當源是新

相關問題