Mam strukturę folderów z wieloma plikami * .csv rozrzuconymi po folderach. Teraz chcę skopiować wszystkie pliki * .csv do innego miejsca docelowego, zachowując strukturę folderów.
Działa poprzez:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
i tak dalej, ale chciałbym to zrobić za pomocą jednego polecenia.
'{}'
działa równie dobrze-execdir
jest to bezpieczniejsze niż-exec
zwykłe zastąpienie jednego z drugim nie zachowuje struktury folderów zgodnie z przeznaczeniem.Możesz również użyć
rsync
do tego.Jeśli chcesz zachować puste katalogi z drzewa źródłowego, pomiń
--prune-empty-dirs
opcję:Jeśli nie chcesz zachować dowiązań symbolicznych, dat modyfikacji, uprawnień do plików, właścicieli itp., Zamień na
-a
inną kombinację-rlptgoD
. ;-)źródło
-m
jest skrótem do--prune-emty-dirs
.-R
dodać opcję kopiowania struktury katalogu nadrzędnego źródła. (por. moja odpowiedź tutaj.)Możesz użyć funkcji Znajdź i CPIO w trybie przejścia
To znajdzie wszystkie pliki .csv w bieżącym katalogu i poniżej i skopiuje je do / target, utrzymując strukturę katalogu zakorzenioną
.
.Jeśli użyjesz
znajdzie wszystkie pliki w
/path/to/files
i poniżej oraz skopiuje je do/target/path/to/files
i poniżej.źródło
cp
Polecenie zezwala wiele argumentów źródłowych:CAVEAT: Używam tutaj globu rekurencyjnego; jest to
globstar
opcja w Bash 4+ksh
i jest domyślnie obsługiwana wzsh
. Globy rekurencyjne nie pasują do ukrytych plików i folderów, a niektóre implementacje podążają za dowiązaniami symbolicznymi, a inne nie .Jeśli twoja powłoka nie obsługuje rekurencyjnych globów lub wolisz ich nie używać, możesz wykonać następujące czynności:
*.csv */*.csv */*/*.csv */*/*/*.csv
- jest to oczywiście bardzo zbędne i wymaga znajomości głębokości struktury katalogów.$(find . -name '*.csv')
- To będzie dopasować ukryte pliki i foldery.find
obsługuje także określanie, czy mają być stosowane dowiązania symboliczne, co może być przydatne.źródło
shopt -s globstar
polecenie tuż przed moim poleceniem i wszystko jest w porządku. Dzięki za kontynuację!--parents
tego szukałem. dziękiTen działał dla mnie:
find -name "*.csv" | xargs cp --parents -t /target
źródło
find [things] | xargs [do stuff]
jest bardzo potężny.find -print0
ixargs -0
.Zakładając, że chcesz powtórzyć tę strukturę od
./source
do./destination
:Jestem gotów policzyć to jako jedną linię, ponieważ
cd source
jest to wbudowana powłoka.źródło
tar
ma-C
opcję uniknięcia pierwszej zmiany katalogu.Z
rsync
strony podręcznika:To też by działało:
źródło