Możesz użyć tar
lub cpio
lub pax
(jeśli którykolwiek z nich jest dostępny), aby skopiować określone pliki, tworząc w razie potrzeby katalogi docelowe. Za pomocą GNU tar, aby skopiować wszystkie zwykłe pliki o nazwie *.txt
lub README.*
pod bieżącym katalogiem do tej samej hierarchii pod ../destination
:
find . -type f \( -name '*.txt' -o -name 'README.*' \) |
tar -cf - -T - |
tar -xf - -C ../destination
Wystarczy find
, cp
, mkdir
a powłoki, można pętli nad pożądanych plików z find
i uruchomić polecenie powłoki kopiować każdego z nich. Jest to powolne i uciążliwe, ale bardzo przenośne. Fragment powłoki otrzymuje docelowy katalog główny as $0
i ścieżkę do pliku źródłowego as $1
; w razie potrzeby tworzy docelowe drzewo katalogów (zwróć uwagę, że uprawnienia do katalogu nie są zachowywane przez poniższy kod), a następnie kopiuje plik. Poniższy fragment kodu działa w każdym systemie POSIX i większości instalacji BusyBox.
find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
mkdir -p "$0/${1%/*}";
cp -p "$1" "$0/$1"
' ../destination {} \;
Możesz grupować sh
wywołania; jest to trochę skomplikowane, ale może być mierzalnie szybsze.
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 {} +
Jeśli masz bash ≥4 (nie wiem, czy Git Bash jest wystarczająco nowy), nie musisz dzwonić find
, możesz użyć **
wzorca globu, aby powrócić do podkatalogów.
shopt -s globstar extglob
for x in **/@(*.txt|README.*); do
mkdir -p "../destination/${x%/*}"
cp -p -- "$x" "../destination/$x"
done
bash
dostępny?