Bash

使用 find 移動文件時保留目錄結構

  • September 1, 2021

我創建了以下腳本,將定義的舊文件從源目錄移動到目標目錄。它執行良好。

#!/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 中,您可以使用zmvfunction、 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/

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