Directory-Structure
如何僅複製匹配的文件,保留子目錄
有沒有辦法做到這一點:“如何在保留文件夾結構的同時從目錄複製文件子集?” ,但不使用 rsync?
是否可以僅使用 cp、find 和 grep 來完成?
我的 bash shell 非常有限(即它是 windows 下的 git shell :( ),所以 rsync 不是一個選項。
我知道我可以得到 cygwin,但我想知道在這種有限的情況下我能做些什麼。
您可以使用
tar
orcpio
或pax
(如果其中任何一個可用)來複製某些文件,並根據需要創建目標目錄。使用 GNU tar,將所有呼叫*.txt
或README.*
目前目錄下的正常文件複製到相同的層次結構下../destination
:find . -type f \( -name '*.txt' -o -name 'README.*' \) | tar -cf - -T - | tar -xf - -C ../destination
僅使用
find
、cp
和mkdir
shell,您可以循環使用所需的文件find
並啟動 shell 命令來複製每個文件。這既慢又麻煩,但非常便攜。shell 片段接收目標根目錄$0
和源文件路徑$1
;它根據需要創建目標目錄樹(請注意,下面的程式碼不保留目錄權限)然後復製文件。下面的程式碼片段適用於任何 POSIX 系統和大多數 BusyBox 安裝。find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c ' mkdir -p "$0/${1%/*}"; cp -p "$1" "$0/$1" ' ../destination {} \;
您可以對
sh
呼叫進行分組;這有點複雜,但可能會更快。find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c ' for x; do mkdir -p "$0/${x%/*}"; cp -p "$x" "$0/$x"; done ' ../destination {} +
如果你的 bash ≥4(我不知道 Git Bash 是否足夠新),你不需要呼叫
find
,你可以使用**
glob 模式遞歸到子目錄。shopt -s globstar extglob for x in **/@(*.txt|README.*); do mkdir -p "../destination/${x%/*}" cp -p -- "$x" "../destination/$x" done