Shell-Script
複製目錄樹結構並將文件複製到特定日期後修改的相應目錄
我有一個包含 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
這將讀取列表的每一行,提取目錄和文件名,創建目錄並複製文件。您將需要更改您正在使用的實際父目錄
source
。target
例如,複製/foo/a/a.txt
到/bar/a/a.txt
、更改source
到foo
和target
到bar
。我無法從您的問題中判斷您是要複製所有目錄,然後只複製特定文件,還是只想要包含文件的目錄。上面的解決方案只會創建必要的目錄。如果要創建所有這些,請使用
find /source -type d -exec mkdir -p {} /target
這將創建目錄。一旦那裡,只需複製文件:
while IFS= read -r file; do cp /source/"$file" /target/"$file" done
更新
這個小腳本將移動 9 月 8 日之後修改的所有文件。它假定 GNU 版本
find
和touch
. 假設您使用的是 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
,則必須每天計算正確的日期。另一種方法是首先找到目錄,在目標中創建它們,然後復製文件:
- 創建所有目錄
find ./ -type d -exec mkdir -p ../bar/{} \;
- 查找並複制相關文件
find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
- 刪除任何空目錄
find ../bar/ -type d -exec rmdir {} \;