Bash
使用 find 移動文件時保留目錄結構
我創建了以下腳本,將定義的舊文件從源目錄移動到目標目錄。它執行良好。
#!/bin/bash echo "Enter Your Source Directory" read soure echo "Enter Your Destination Directory" read destination echo "Enter Days" read days find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \; echo "Files which were $days Days old moved from $soure to $destination"
該腳本可以很好地移動文件,它還可以移動源子目錄的文件,但不會將子目錄創建到目標目錄中。我想在其中實現這個附加功能。
舉個例子
/home/ketan : source directory /home/ketan/hex : source subdirectory /home/maxi : destination directory
當我執行此腳本時,它還會將十六進制的文件移動到 maxi 目錄中,但我需要在 maxi 目錄中創建相同的十六進制並將其文件移動到相同的十六進制中。
您
mv /home/ketan/hex/foo /home/maxi
需要根據find
. 如果您先切換到源目錄並執行find .
. 現在您只需將目標目錄添加到由find
. 您需要在find … -exec
命令中執行一個 shell 來執行連接,並在必要時創建目標目錄。destination=$(cd -- "$destination" && pwd) # make it an absolute path cd -- "$source" && find . -type f -mtime "-$days" -exec sh -c ' mkdir -p "$0/${1%/*}" mv "$1" "$0/$1" ' "$destination" {} \;
請注意,如果
$destination
包含特殊字元,為避免引用問題,您不能只在 shell 腳本中替換它。您可以將它導出到環境中,以便它到達內殼,或者您可以將它作為參數傳遞(這就是我所做的)。sh
您可以通過對呼叫進行分組來節省一些執行時間:destination=$(cd -- "$destination" && pwd) # make it an absolute path cd -- "$source" && find . -type f -mtime "-$days" -exec sh -c ' for x do mkdir -p "$0/${x%/*}" mv "$x" "$0/$x" done ' "$destination" {} +
或者,在 zsh 中,您可以使用
zmv
function、 the.
和m
glob 限定符來僅匹配正確日期範圍內的正常文件。如果需要,您需要傳遞一個替代mv
函式,該函式首先創建目標目錄。autoload -U zmv mkdir_mv () { mkdir -p -- $3:h mv -- $2 $3 } zmv -Qw -p mkdir_mv $source/'**/*(.m-'$days')' '$destination/$1$2'
我知道
find
是指定的,但這聽起來像是rsync
.我最常使用以下內容:
rsync -axuv --delete-after --progress Source/ Target/
如果您只想移動特定文件類型的文件(範例),這是一個很好的範例:
rsync -rv --include '*/' --include '*.js' --exclude '*' --prune-empty-dirs Source/ Target/