Replace

將目錄與同名文件合併時,如何確保只替換更小+更早的文件?

  • June 23, 2012

例如,如果您想將兩個目錄相互合併(通過將目錄 1 中的所有內容移動到目錄 2 中),並且目錄 1 和目錄 2 都有一些同名的文件。

那麼如何編寫程式碼,以便如果在兩個目錄中都找到 SharedFile,則將目錄 2 中的 SharedFile 替換為目錄 1 中的 SharedFile IF SharedFile 在目錄 1 中較大並且SharedFile 在目錄 1 中具有較晚的修改日期?(但不要替換 SharedFile 否則)。

我對 tcsh 和 bash 腳本都很好。

這是一個模擬 rsync 核心行為的 bash/ksh93/zsh 腳本,您可以在其中輕鬆調整復製或不複製源文件的決定。僅當源文件較大且較新時,才會在此處進行複制。在 bash 中,shopt -s globdots在腳本之前添加。未經測試。

target=/path/to/destination
cd source-directory
skip=
err=0
for x in **/*; do
 # Skip the contents of a directory that has been copied wholesale
 case $x in $skip/*) continue;; *) skip=;; esac
 if [[ -d $x ]]; then
   # Recreate source directory on the target.
   # Note that existing directories do not have their permissions or modification times updated.
   if [[ -e $target/$x ]]; then continue; fi
   skip=$x
   if [[ -e $target/$x ]]; then
     echo 1>&2 "Not overwriting non-directory $target/$x with a directory."
     err=1
   else
     # The directory doesn't exist on the destination, so copy it
     cp -Rp -- "$x" "$target/$x" || err=1
   fi
 elif [[ -f $x ]]; then
   # We have a regular file. Copy it over if desired.
   if [[ $x -nt $target/$x ]] && [ $(wc -c <"$x") -gt $(wc -c <"$target/$x") ]; then
     cp -p -- "$x" "$target/$" || err=1
   fi
 else
   # neither a file nor a directory. Overwrite the destination
   cp -p -- "$x" "$target/$x" || err=1
 fi
done

引用自:https://unix.stackexchange.com/questions/41332