Replace
將目錄與同名文件合併時,如何確保只替換更小+更早的文件?
例如,如果您想將兩個目錄相互合併(通過將目錄 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