2013-03-25 16 views
50

W systemie Unix chcę skopiować wszystkie pliki z określonym rozszerzeniem (wszystkie pliki Excela) ze wszystkich podkatalogów do innego katalogu. Mam następujące polecenie:Skopiuj wszystkie pliki z pewnym rozszerzeniem ze wszystkich podkatalogów.

cp --parents `find -name \*.xls*` /target_directory/ 

Problemy z tej komendy to:

  • kopiuje struktura katalogów, jak również, a ja chce tylko pliki (więc wszystkie pliki powinny zakończyć się w/target_directory /)

  • To nie kopiowanie plików ze spacjami w nazwach plików (które są całkiem sporo)

Jakieś rozwiązanie tych problemów?

+0

Co z 'find ... exec mv'? – fedorqui

Odpowiedz

86

--parents kopiuje strukturę katalogów, więc powinieneś się tego pozbyć.

Sposób napisałeś tego, find Wykonuje, a wyjście jest umieszczany na linii poleceń, tak że cp nie potrafią odróżnić przestrzeniach oddzielających nazwach plików, a przestrzenie ciągu nazwy pliku. Lepiej zrobić coś takiego

$ find . -name \*.xls -exec cp {} newDir \; 

w którym cp jest wykonywany dla każdego pliku, który find stwierdzi, i zdał pliku poprawnie. Here's more info w tej technice.

Zamiast wszystko powyższe, można użyć zsh i wystarczy wpisać

$ cp **/*.xls target_directory 

zsh może poszerzyć symbole wieloznaczne zawierać podkatalogi i sprawia, że ​​tego typu rzeczy bardzo proste.

+0

Przepraszam za mój analfabetyzm, ale co masz na myśli mówiąc "bin"? – Abdel

+0

Wrzuć do kosza. – bmargulies

+1

Tak. "bin to" oznacza wyrzucić to. Teraz zmieniono :-) –

5

Miałem podobny problem. I rozwiązać go za pomocą:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";" 

'{}' i ";" wykonuje kopię na każdym pliku.

11

Z powyższego, wymyśliłem tę wersję. Ta wersja działa również dla mnie w terminalu odzyskiwania maku.

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';' 

Będzie wyglądać w bieżącym katalogu i rekurencyjnie we wszystkich podkatalogach dla plików z rozszerzeniem xsl. Skopiuje je wszystkie do katalogu docelowego.

cp flagi są:

  • p - zachować atrybuty pliku
  • R - rekurencyjne
  • v - gadatliwy (pokazuje, co jest kopiowany)
+1

To jest to samo, co musiałem zrobić, gdy SSH w Bluehost. – Plummer

1

Miałem również zrobić to samemu.Zrobiłem to za pośrednictwem argumentu --parents dla cp:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \; 
Powiązane problemy