2013-01-17 27 views
6

Na przykład, katalog może zawierać plikiSkopiuj wszystkie pliki w katalogu z danym ciągiem w nazwie pliku do innego katalogu w Bash

12_foo9.dat 
34foo32.txt 
24foobar.png 
997_bar.txt 

i chciałbym, aby skopiować pliki z „foo” w nazwy plików do oddzielnego katalogu, aby zawierał te pierwsze trzy pliki, ale nie czwarte.

szukałem wokół, ale nie wymyśliliśmy sposób, aby to zrobić. Katalog ma bardzo dużą liczbę plików, ale tylko 1% lub więcej, które muszę skopiować.

Dzięki

Odpowiedz

8
$ mkdir NEWDIR 

$ touch foo_file file_foo file_foo_file 

$ ls 
NEWDIR  file_foo file_foo_file foo_file 

$ cp -v *foo NEWDIR/ 
file_foo -> NEWDIR/file_foo 

$ cp -v foo* NEWDIR/ 
foo_file -> NEWDIR/foo_file 

$ cp -v *foo* NEWDIR/ 
file_foo -> NEWDIR/file_foo 
file_foo_file -> NEWDIR/file_foo_file 
foo_file -> NEWDIR/foo_file 

$ ls NEWDIR/ 
file_foo file_foo_file foo_file 
+0

Dzięki za opracowanie! –

+0

co robi -v? – Aaron

0

Zastosowanie globbing:

wyjściowe
shopt -s failglob 
echo cp *foo* /path/to/separate 

Będzie to polecenie Kopiuj (lub niepowodzeniem z bash: no match: *foo*).

Usuń echo po sprawdzeniu poprawności danych wyjściowych do faktycznie kopiowania wpisów do katalogu.

+0

Jakie korzyści spowoduje „echo” dostarczyć? Nie wyjaśnia, które pliki zostaną uwzględnione. Jeśli chcesz, musisz "ls * foo *" potwierdzić pliki, które będą dopasowane, a następnie "cp * foo */target", aby skopiować to samo. Właściwie, myślę, że dodam tę sugestię do mojej odpowiedzi ... – DreadPirateShawn

+0

@DreadPirateShawn: Dzięki za komentarz. Zaktualizowałem swoją odpowiedź (przetestowałem z Bash v4.2.37). – Johnsyweb

0
cp *foo* /path/to/separate_directory 

Jeśli chcesz sprawdzić poprawność plików, które zostaną zawarte po pierwsze, zastosowanie:

ls *foo* 

to potwierdzi pliki mają być dopasowane, a następnie można ponownie wykorzystać ten sam wzór z cp, aby wykonać kopię.

4

Spróbuj oświadczenie: cp *foo* /newdir

+0

Dzięki, to takie proste, przepraszam, że pytam o coś tak oczywistego! –

+0

NP - Nie chcę się śpieszyć dla przedstawicieli, ale nie krępuj się zaakceptować tę odpowiedź :-) – dough

2

Jeśli jesteś naprawdę zaniepokojony liczbą plików (np uruchomionych w milionach) można użyć:

find . -type f -depth 1 -name "*foo*" -exec cp {} /otherdir \; -print 

nie używać rozszerzenia powłoki, tak nie będziesz próbował uruchomić polecenia z milionem argumentów. Numer -print wskazuje na postęp i można go pominąć. Po prostu listę plików, które mają zostać skopiowane:

find . -type f -depth 1 -name "*foo*" 
Powiązane problemy