2013-01-17 11 views
6

Zum Beispiel kann ein Verzeichnis, das die Dateienalle Dateien in einem Verzeichnis mit einer bestimmten Zeichenfolge im Dateinamen zu anderem Verzeichnis in Bash

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

enthalten könnte, und ich mag die Dateien mit ‚foo‘ kopieren in die Dateinamen in ein separates Verzeichnis, so dass es diese ersten drei Dateien enthält, aber nicht die vierte.

Ich habe mich umgeschaut, aber habe keine Möglichkeit gefunden, dies zu tun. Das Verzeichnis hat eine sehr große Anzahl von Dateien, aber nur 1% oder so, dass ich kopieren muss.

Dank

Antwort

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

Danke für die Ausarbeitung! –

+0

Was macht -v? – Aaron

0

Verwendung globbing:

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

der Kopierbefehl (oder nicht mit bash: no match: *foo*) Dies wird ausgegeben.

Entfernen Sie die echo, wenn Sie die Ausgabe tatsächlich Kopie die Verzeichniseinträge validiert haben.

+0

Welchen Nutzen hat der „Echo“ zur Verfügung stellen? Es wird nicht klargestellt, welche Dateien enthalten sind. Wenn du das willst, willst du "ls * foo *", um die Dateien zu bestätigen, die gefunden werden, und dann "cp * foo */target", um dasselbe zu kopieren. Eigentlich denke ich, ich werde diesen Vorschlag meiner Antwort hinzufügen ... – DreadPirateShawn

+0

@DreadPirateShawn: Danke für den Kommentar. Ich habe meine Antwort aktualisiert (getestet mit Bash v4.2.37). – Johnsyweb

0
cp *foo* /path/to/separate_directory 

Wenn Sie die Dateien überprüfen möchten, die zuerst enthalten sein wird, ist die Verwendung:

ls *foo* 

Dadurch werden die Dateien bestätigen angepasst werden, dann können Sie wieder verwenden das gleiche Muster mit der cp-Befehl zum Ausführen der Kopie.

4

Versuchen Sie diese Aussage: cp *foo* /newdir

+0

Danke, das ist so einfach, tut mir leid, dass ich etwas so Offensichtliches gefragt habe! –

+0

NP - Ich möchte nicht für Rep wiederholen, aber fühlen Sie sich frei, diese Antwort zu akzeptieren :-) – dough

2

Wenn Sie wirklich besorgt über die Anzahl der Dateien (zB in Millionen) Sie nutzen könnten:

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

Diese Erweiterung nicht Schale nicht verwendet, so Sie werden nicht versuchen, einen Befehl mit einer Million Argumente auszuführen. Die -print gibt Ihnen einen Hinweis auf Fortschritte und kann weggelassen werden. Um einfach die Dateien aufzulisten, die kopiert werden sollen:

find . -type f -depth 1 -name "*foo*" 
Verwandte Themen