W systemie unix chcę skopiować wszystkie pliki z określonym rozszerzeniem (wszystkie pliki programu Excel) ze wszystkich podkatalogów do innego katalogu. Mam następujące polecenie:
cp --parents `find -name \*.xls*` /target_directory/
Problemy z tym poleceniem to:
Kopiuje również strukturę katalogów, a ja chcę tylko pliki (więc wszystkie pliki powinny trafić do / target_directory /)
Nie kopiuje plików ze spacjami w nazwach plików (których jest sporo)
Jakieś rozwiązania tych problemów?
find... exec mv
?Odpowiedzi:
--parents
kopiuje strukturę katalogów, więc powinieneś się tego pozbyć.Sposób, w jaki to napisałeś,
find
wykonuje, a dane wyjściowe są umieszczane w wierszu poleceń w taki sposób, żecp
nie można odróżnić spacji oddzielających nazwy plików od spacji w nazwie pliku. Lepiej zrobić coś takiegow którym
cp
jest wykonywany dla każdejfind
znalezionej nazwy pliku i poprawnie przekazuje nazwę pliku. Oto więcej informacji na temat tej techniki.Zamiast tego możesz użyć zsh i po prostu wpisać
zsh
może rozwinąć symbole wieloznaczne, aby uwzględnić podkatalogi, co bardzo ułatwia tego rodzaju czynności.źródło
Bash
4.0+, aksh93
także obsługuje**
. W przypadku basha użyj,shopt -s globstar
aby go włączyć. Dla ksh toset -G
lubset -o globstar
.find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Z powyższego wymyśliłem tę wersję. Ta wersja działa również dla mnie w terminalu odzyskiwania mac.
Będzie szukał plików z rozszerzeniem xsl w bieżącym katalogu i rekurencyjnie we wszystkich podkatalogach. Skopiuje je wszystkie do katalogu docelowego.
flagi cp to:
źródło
Miałem podobny problem. Rozwiązałem to używając:
Program
'{}'
i";"
wykonuje kopię każdego pliku.źródło
Sam też musiałem to zrobić. Zrobiłem to za pomocą argumentu --parents dla cp:
źródło
możesz usunąć opcję --parents, ale istnieje ryzyko kolizji, jeśli wiele plików ma tę samą nazwę.
źródło