Выполните команду, в которой найден файл

Как выполнить команду, в которой найден файл?
У меня есть каталог с именем testdir который содержит следующее:

 $ ls -R testdir/ testdir/: dir1 dir2 dir3 dir4 dir5 testdir/dir1: doc1.pdf testdir/dir2: file1.txt testdir/dir3: doc2.pdf testdir/dir4: file2.txt testdir/dir5: doc5.pdf 

Теперь я хочу выполнить действие (выполнить команду), где find находит определенный тип файла / файла. Например, позвольте мне найти *.pdf :

 $ find . -name '*.pdf' ./testdir/dir3/doc2.pdf ./testdir/dir5/doc5.pdf ./testdir/dir1/doc1.pdf 

Теперь предположим, что я хочу выполнить команду (например, сказать touch file ), где указанная выше команда находит файл (ы). Другими словами, я хочу создать файл с именем file в каждой директории, где было найдено хотя бы один .pdf чтобы я получил:

 $ ls -R testdir/ testdir/: dir1 dir2 dir3 dir4 dir5 testdir/dir1: doc1.pdf file testdir/dir2: file1.txt testdir/dir3: doc2.pdf file testdir/dir4: file2.txt testdir/dir5: doc5.pdf file 

Как я могу выполнить такую ​​работу?
Может быть для каждого найденного файла, cd где существует файл, и выполнять команду рекурсивно.
Я знаю, что find имеет удивительную особенность: -exec но я не могу заставить его работать.


Это только пример получения идеи о том, что я хочу делать. В целом: как выполнить команду, где файлы (ы) найдены (путем find ) рекурсивно?

4 Solutions collect form web for “Выполните команду, в которой найден файл”

Если вы запустите эту команду, ваш touch file будет запущен, потенциально несколько раз, из каталога, в котором была запущена команда:

 find -name '*.pdf' -exec touch file \; 

С другой стороны, если вы запустите этот вариант, каждый экземпляр команды будет запущен в каталоге целевого файла:

 find -name '*.pdf' -execdir touch file \; 

В обоих случаях вы можете увидеть это в действии, заменив touch file либо echo {} и / или pwd .


Из manpage:

-execdir command ;
-execdir command {} +

    Как -exec , но указанная команда запускается из подкаталога, содержащего сопоставленный файл, который обычно не является каталогом, в котором вы начали find .

С помощью zsh вы можете использовать квалификаторы glob для выбора, например, только .pdf файлов и с помощью модификаторов сохранять имена каталогов в массиве с уникальными элементами, а затем cd в каждый из этих каталогов и запускать вашу команду. Таким образом, вы выполняете свою команду только один раз в каждом каталоге, независимо от количества .pdf s, которые были найдены в этом каталоге:

 dirlist=(**/*.pdf(.:a:h)) for d in ${(u)dirlist[@]} (cd $d && touch file) с dirlist=(**/*.pdf(.:a:h)) for d in ${(u)dirlist[@]} (cd $d && touch file) 

или

 typeset -U dirlist dirlist=(**/*.pdf(.:a:h)) for d in ${dirlist} (cd $d && touch file) с typeset -U dirlist dirlist=(**/*.pdf(.:a:h)) for d in ${dirlist} (cd $d && touch file) 

Вы также можете объединить модификаторы и квалификаторы, например, для glob для обычных файлов (скрытых и не скрытых) с расширением .bkp и сохранения уникальных имен каталогов в массиве:

 dirlist=(**/*.bkp(D.:a:h)) 

Вы можете извлечь каталог filename с именем dirname и взять его оттуда, что-то вроде этого:

 find . -name "*.pdf" -type f -exec bash myscript {} \; 

где файл myscript содержит следующее:

 dir=$(dirname "$1") cd "$dir" touch file 

Посмотрите не дальше, чем на вход:

https://bitbucket.org/eradman/entr

Что вы можете сделать, так это разрешить доступ к указанному каталогу. Когда find находит файл, коснитесь файла, называемого, скажем, triggerfile.txt в этом каталоге, и пусть entr возьмет верх.

  • Как путь к поиску «человеческих» страниц задан?
  • Как найти именно этот исполняемый файл, который будет запущен, если это имя введено в командной строке?
  • Скомпилировано, невозможно получить доступ к sudo
  • Как проверить действительные каталоги $ PATH и вывести их, указав, действителен ли каждый из них?
  • читать имя пути с пробелами, затем использовать переменную в команде find
  • Компилятор не может найти заголовочный файл, добавить ли каталог в PATH?
  • Почему двоеточие выбрано в качестве разделителя путей
  • Как добавить программу с каталогом зависимостей в $ PATH?
  • несоответствие между путями для двоичной и служебной страницы
  • Запуск исполняемого файла в PATH с тем же именем, что и существующая функция
  • Где исполняемые файлы ищут общие объекты во время выполнения?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.