Как выразить все файлы / каталоги в опции extra -exec команды `find`?

У меня есть задача скопировать все файлы из нескольких каталогов со специальными именами в целевой каталог.

Поэтому я создаю этот каталог для проверки моей команды. Дерево тестового каталога выглядит так:

. ├── dir1 │  └── file1 └── test 

Моя предназначенная команда для mv всех файлов из dir1 для тестирования:

 find . -type d -name "*dir*" -exec mv {}/* test \; 

Затем я получил:

 mv: rename ./dir1/* to test/*: No such file or directory 

Я предполагаю, что это связано с тем, что в этом экстренном выражении команда не обрабатывала * в качестве подстановочного знака.

Так я и сделал:

 find . -type d -name "*dir*" -exec mv {}/file1 test \; 

Что успешно перенесло файл1 для тестирования.

Но дело в том, что мне нужно теперь выражение для всех файлов, чтобы я мог выполнить эту работу по передаче файлов.

Как я могу выразить это в команде find -exec ?

mv "$dir_path"/* ... будет не только перемещать файлы, но и все в "$dir_path" . По крайней мере, все, чье имя не начинается с точки (скрытые файлы). В bash вы можете изменить это с помощью опции dotglob . Но если * расширяет красиво (соответствует всем, но не слишком много для командной строки), то вы можете использовать оболочку для косвенности:

 find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \; 

Пытаться:

 $ find -type d -name '*dir*' -exec sh -c ' for d do for f in "$d"/*; do [ -f "$f" ] && mv -- "$f" /path/to/test done done ' sh {} + 

Вы можете попробовать это. Учитывая, что тестовый каталог находится в том же каталоге с другими каталогами,

 find . -mindepth 2 ! -name test -exec cp {} test \; 

Это скопирует все отдельные файлы в тестовый каталог, экранируя dir1, dir2 и т. Д. Обратите внимание, что это опускает сами подкаталоги и копирует их содержимое. вы также можете проверить это, используя команду ls.

 find . -mindepth 2 ! -name test -ls