Intereting Posts
Отметить копию идентификатора в PDF-распечатке tmux-сервер игнорирует конфигурационный файл sourcing Как удалить все файлы с заданным именем во всех подкаталогах? Fedora 21 – Проблема после пробуждения после закрытия Как запустить новую версию AIX в виртуальной машине с хостом Linux? Сценарий с датой ввода, выходным днем Почему печать работает с awk, но с эхом нет? команды сортировки и uniq не работают, как ожидалось, когда выполняются cron Почему bash появляется быстрее в VM Ubuntu, чем на главном MacOS? Как я могу использовать «emulate sh» в zsh для работы с ». myscript.sh»? Разрешить пользователю запускать команду с аргументами (которая содержит пробелы) В Aix есть какая-либо команда, которая дает путь или ссылку на исполняемый файл процесса в / proc / <pid> Как получить почти идеальное качество записи на экране? Предоставлять строки, хранящиеся в файле, в виде списка аргументов для команды? Как получить btrfs для выделения места на новом устройстве?

Как выразить все файлы / каталоги в опции 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