Shell-Script

複製目錄樹結構並將文件複製到特定日期後修改的相應目錄

  • September 18, 2014

我有一個包含 30 多個子目錄的文件夾,我想獲取在指定日期之後修改的文件列表(例如 9 月 8 日,這是真實情況),並使用相同的樹結構進行複制,僅修改該文件夾中的文件

我已經說 30 目錄,我有我需要使用上次修改日期找到的文件列表查找命令輸出

a/a.txt
a/b/b.txt
a/www.txt
etc..

例如,我希望創建文件夾“a”並且其中只有 a.txt…同樣明智地創建另一個“a/b”並在其中創建 b.txt…

假設您在文本文件中有所需的文件,您可以執行類似的操作

while IFS= read -r file; do 
   echo mkdir -p ${file%/*}; 
   cp /source/"$file" /target/${file%/*}/${file##*/}; 
done < files.txt 

這將讀取列表的每一行,提取目錄和文件名,創建目錄並複製文件。您將需要更改您正在使用的實際父目錄sourcetarget例如,複製/foo/a/a.txt/bar/a/a.txt、更改sourcefootargetbar


我無法從您的問題中判斷您是要複製所有目錄,然後只複製特定文件,還是只想要包含文件的目錄。上面的解決方案只會創建必要的目錄。如果要創建所有這些,請使用

find /source -type d -exec mkdir -p {} /target

這將創建目錄。一旦那裡,只需複製文件:

while IFS= read -r file; do 
   cp /source/"$file" /target/"$file"
done

更新

這個小腳本將移動 9 月 8 日之後修改的所有文件。它假定 GNU 版本findtouch. 假設您使用的是 Linux,這就是您將擁有的。

#!/usr/bin/env bash    

## Create a file to compare against.
tmp=$(mktemp)
touch -d "September 8" "$tmp"

## Define the source and target parent directories
source=/path/to/source
target=/path/to/target

## move to the source directory
cd "$source"

## Find the files that were modified more recently than $tmp and copy them
find ./ -type f -newer "$tmp" -printf "%h %p\0" | 
   while IFS= read -rd '' path file; do
       mkdir -p "$target"/"$path"
       cp "$file" "$target"/"$path"
   done

嚴格來說,你不需要 tmp 文件。但是,通過這種方式,相同的腳本將在明天起作用。否則,如果您使用 find’s -mtime,則必須每天計算正確的日期。


另一種方法是首先找到目錄,在目標中創建它們,然後復製文件:

  1. 創建所有目錄
find ./ -type d -exec mkdir -p ../bar/{} \;
  1. 查找並複制相關文件
find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
  1. 刪除任何空目錄
find ../bar/ -type d -exec rmdir {} \;

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