Directory-Structure

如何僅複製匹配的文件,保留子目錄

  • March 5, 2012

有沒有辦法做到這一點:“如何在保留文件夾結構的同時從目錄複製文件子集?” ,但不使用 rsync?

是否可以僅使用 cp、find 和 grep 來完成?

我的 bash shell 非常有限(即它是 windows 下的 git shell :( ),所以 rsync 不是一個選項。

我知道我可以得到 cygwin,但我想知道在這種有限的情況下我能做些什麼。

您可以使用tarorcpiopax(如果其中任何一個可用)來複製某些文件,並根據需要創建目標目錄。使用 GNU tar,將所有呼叫*.txtREADME.*目前目錄下的正常文件複製到相同的層次結構下../destination

find . -type f \( -name '*.txt' -o -name 'README.*' \) |
tar -cf - -T - |
tar -xf - -C ../destination

僅使用findcpmkdirshell,您可以循環使用所需的文件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

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