2016-04-23 4 views
1

Supposons qu'il y ait un répertoire avec de nombreux sous-répertoires aaa, bbb, ccc ... Dans l'un de ces répertoires est un fichier appelé x.txt (mais je ne sais pas dans lequel des répertoires).bash: (! Et un seul) déplacer un fichier à partir d'un sous-répertoire inconnu (? Wildcard)

Je voulais déplacer ce fichier vers un autre répertoire en utilisant:

mv */x.txt {target_dir} 

Toutefois, cela ne fonctionne pas: No such file or directory

Comme solution, je fini par boucle sur tous les sous-répertoires et vérifier si le fichier est là avec [ -f ], et le déplacement du fichier une fois localisé.

Cependant, je me demandais s'il y a une solution plus simple?

Répondre

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

Merci, j'aurais dû mentionner qu'il y a des milliers de répertoires et des milliers de fichiers. Je connais le nom du fichier 'x.txt' (et c'est un nom unique donc je sais que ce fichier est dans un seul répertoire). Je vais essayer ceci pour voir si votre solution est plus rapide. – econ

+0

@econ: Vous pouvez remplacer le '.' par le répertoire de base. – sjsam

+1

Je pense qu'il est bon d'avoir un coup d'oeil [ici] (http://superuser.com/questions/341232/faster-alternatives-to-find-and-locate) – sjsam

1

De l'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. 

Vous pouvez essayer d'activer l'option 'globstar', et en utilisant

shopt -s globstar 
echo **/x.txt 

Si l'écho trouve le fichier, il en sera le équivalent

mv **/x.txt {target_dir} 

Remarque: globstar est une option de bash uniquement (ajoutée dans bash 4.0) Si vous utilisez une version plus ancienne (telle que bash 3 qui est standard sur le MAC) cela ne fonctionnera pas.

+0

Merci, vous avez raison, j'utilise le bash par défaut sur OSX (3.2), mais c'est une raison supplémentaire pour mettre à niveau vers la version 4.0. Je pense donc que je vais passer à bash 4 au cours de l'été. – econ