2013-09-05 70 views
0

我想將所有我的文件移到/ home/user/archive,將所有超過1000天的文件(分佈在各個子文件夾中)從/ home/user/documents移動。我嘗試的命令是僅存檔舊文件並重新構建存檔中的文件夾樹

find /home/user/documents -type f -mtime +1000 -exec rsync -a --progress --remove-source-files {} /home/user/archive \; 

的問題是,(可以理解)的所有文件最終被移動到一個文件夾中的/ home /用戶/歸檔。但是,我想要的是在/ home/user/archive內的/ home/user /文件下重新構建文件樹。我認爲這應該是可能的,只需簡單地用另一個替換字符串,但如何?什麼是服務於此目的的命令?

謝謝!

+1

這可能有助於:http://stackoverflow.com/q/1650164/1983854 – fedorqui

回答

2

我會走這條路,而不是rsync

  1. 更改目錄,這樣就可以處理相對路徑名,而不是絕對的:

    cd /home/user/documents 
    
  2. 運行您find命令和飼料輸出到cpio,請求它創建文件的硬鏈接(-l),創建主要目錄(-d)並保留屬性(-m)。 -print0-0選項使用空值作爲記錄終止符,以正確處理文件名中帶有空格的文件名。 的-l選項使用鏈接而不是實際複製文件,因此使用的附加空間非常少(只是新目錄需要)。

    find . -type f -mtime +1000 -print0 | cpio -dumpl0 /home/user/archives 
    
  3. 重新運行find命令和輸出饋送到xargs rm刪除原稿:

    find . -type f -mtime +1000 -print0 | xargs -0 rm 
    
+0

+1'cpio'就是這樣一個被低估的工具:) – konsolebox

0

以下腳本了。

#!/bin/bash 

[ -n "$BASH_VERSION" ] && [[ BASH_VERSINFO -ge 4 ]] || { 
    echo "You need Bash version 4.0 to run this script." 
    exit 1 
} 

# SOURCE=/home/user/documents/ 
# DEST=/home/user/archive/ 

SOURCE=$1 
DEST=$2 

declare -i DAYSOLD=10 
declare -a DIRS=() 
declare -A DIRS_HASH=() 
declare -a FILES=() 
declare -i E=0 

# Check directories. 

[[ -n $SOURCE && -d $SOURCE && -n $DEST && -d $DEST ]] || { 
    echo "Source or destination directory may be invalid." 
    exit 1 
} 

# Format source and dest variables properly: 

SOURCE=${SOURCE%/} 
DEST=${DEST%/} 
SOURCE_LENGTH=${#SOURCE} 

# Copy directories first. 

echo "Creating directories." 

while read -r FILE; do 
    DIR=${FILE%/*} 
    if [[ -z ${DIRS_HASH[$DIR]} ]]; then 
     PARTIAL=${DIR:SOURCE_LENGTH} 
     if [[ -n $PARTIAL ]]; then 
      TARGET=${DEST}${PARTIAL} 
      echo "'$TARGET'" 
      mkdir -p "$TARGET" || ((E += $?)) 
      chmod --reference="$DIR" "$TARGET" || ((E += $?)) 
      chown --reference="$DIR" "$TARGET" || ((E += $?)) 
      touch --reference="$DIR" "$TARGET" || ((E += $?)) 
      DIRS+=("$DIR") 
     fi 
     DIRS_HASH[$DIR]=. 
    fi 
done < <(exec find "$SOURCE" -mindepth 1 -type f -mtime +"$DAYSOLD") 

# Copy files. 

echo "Copying files." 

while read -r FILE; do 
    PARTIAL=${FILE:SOURCE_LENGTH} 
    cp -av "$FILE" "${DEST}${PARTIAL}" || ((E += $?)) 
    FILES+=("$FILE") 
done < <(exec find "$SOURCE" -mindepth 1 -type f -mtime +"$DAYSOLD") 

# Remove old files. 

if [[ E -eq 0 ]]; then 
    echo "Removing old files." 
    rm -fr "${DIRS[@]}" "${FILES[@]}" 
else 
    echo "An error occurred during copy. Not removing old files." 
    exit 1 
fi 
相關問題