2016-04-23 6 views
1

Предположим, что существует каталог с большим количеством поддиректорий aaa, bbb, ccc ... В одном из этих каталогов является файл с именем x.txt (но я не знаю, в какой из каталогов).Баш: (! И только один) переместить файл из неизвестного подкаталоге (? Подстановочные)

Я хотел, чтобы переместить этот файл в другой каталог с помощью:

mv */x.txt {target_dir} 

Однако это не работает: No such file or directory

В качестве решения я в конечном итоге цикл по всем подкаталогов и проверки, если файл находится с [ -f ] и перемещением файла после его нахождения.

Однако, мне было интересно, есть ли более простое решение?

ответ

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

Спасибо, я должен был упомянуть о тысячах каталогов и тысяч файлов. Я знаю имя файла 'x.txt' (и это уникальное имя, поэтому я знаю, что такой файл находится только в одном каталоге). Я попробую это, чтобы узнать, быстрее ли ваше решение. – econ

+0

@econ: Вы можете заменить '.' базовым каталогом. – sjsam

+1

Я думаю, что это хорошо, чтобы посмотреть [здесь] (http://superuser.com/questions/341232/faster-alternatives-to-find-and-locate) – sjsam

1

С Баш страница руководства:

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. 

Вы можете попробовать включить опцию 'globstar' и используя

shopt -s globstar 
echo **/x.txt 

Если эхо находит файл, так что будет эквивалент

mv **/x.txt {target_dir} 

Примечание: globstar - вариант только для bash (добавлен в bash 4.0). Если вы используете более старую версию (например, bash 3, которая является стандартной для MAC), это не сработает.

+0

Спасибо, ты прав, я использую default bash на OSX (3.2), но это одна дополнительная причина для обновления до 4.0. Поэтому я думаю, что летом я перейду в bash 4. – econ