2016-04-23 14 views
1

Angenommen, es ist ein Verzeichnis mit vielen Unterverzeichnissen aaa, bbb, ccc ... In einem diesen Verzeichnissen ist eine Datei mit dem Namen x.txt (aber ich weiß nicht, in welchem ​​der Verzeichnisse).bash: (! Und nur ein), eine Datei von einem unbekannten Unterverzeichnis (? Wildcard) bewegt

Ich wollte, dass die Datei in ein anderes Verzeichnis bewegen Sie mit:

mv */x.txt {target_dir} 

Allerdings funktioniert das nicht: No such file or directory

Als Lösung Ich landete Schleifen über alle Unterverzeichnisse und prüfen, ob Die Datei ist dort mit [ -f ], und Verschieben der Datei einmal gefunden.

Allerdings habe ich mich gefragt, ob es eine einfachere Lösung gibt?

Antwort

3
find . -type f -name x.txt -exec mv {} target_dir \; 
+0

Danke, ich hätte erwähnen sollen, dass es Tausende von Verzeichnissen und Tausende von Dateien gibt. Ich kenne den Namen der Datei 'x.txt' (und es ist ein eindeutiger Name, so dass ich weiß, dass sich diese Datei nur in einem Verzeichnis befindet). Ich werde dies versuchen, um zu sehen, ob Ihre Lösung schneller ist. – econ

+0

@econ: Sie können das '.' durch das Basisverzeichnis ersetzen. – sjsam

+1

Ich denke, es ist gut, sich [hier] (http://superuser.com/questions/341232/faster-alternatives-to-find-and-locate) – sjsam

1

Vom bash manpage:

globstar 
     If set, the pattern ** used in a pathname expansion context will match 
     all files and zero or more directories and subdirectories. If the 
     pattern is followed by a /, only directories and subdirectories match. 

Sie könnten versuchen, die 'globstar' Option aktivieren, und mit

shopt -s globstar 
echo **/x.txt 

Wenn das Echo die Datei findet, so wird die äquivalent

mv **/x.txt {target_dir} 

Hinweis: globstar ist eine Bash-Option (hinzugefügt in Bash 4.0) Wenn Sie eine ältere Version (wie die Bash 3, die auf dem MAC Standard ist) verwenden, wird dies nicht funktionieren.

+0

Danke, du hast Recht, ich benutze die Standard-Bash unter OSX (3.2), aber dies ist ein zusätzlicher Grund für ein Upgrade auf 4.0. Also denke ich, dass ich im Sommer auf Bash 4 gehen werde. – econ