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

Как выполнить команду, в которой найден файл?
У меня есть каталог с именем 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 ) рекурсивно?

  • Где исполняемые файлы ищут общие объекты во время выполнения?
  • Что делать, когда .profile не существует для редактирования PATH?
  • POSIX гарантирует, что стандартные утилиты находятся в PATH?
  • Почему двоеточие выбрано в качестве разделителя путей
  • Как настроить среду после установки программного обеспечения внутри домашнего каталога?
  • zsh - полностью расширяет двоичный путь на вкладке <tab>
  • Работа с экспортом странного поведения PATH CentOS
  • Не удалось добавить папку в PATH в файл .profile.
  • 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 возьмет верх.

    Interesting Posts

    Лучше ли загружать Firefox с веб-сайта или использовать диспетчер пакетов?

    Как отсортировать файл по столбцу, представляющему собой сочетание цифр, букв и знаков препинания?

    Когда создавать новую эпоху для пакета Debian?

    Предотвратить удаление пользователем файла

    Где Nautilus получает описание своего файла

    серверы имен стираются после перезапуска systemctl network.service

    Как найти файлы по сравнению со временем определенного файла

    Перенаправить stderr из уже запущенного скрипта

    Что означает @ в имени хоста в файле .rhosts в Solaris?

    В чем разница между echo `date`, echo" date "и echo '' date`?

    Измените устройство hidraw с мыши на джойстик

    Что я должен рассмотреть, чтобы написать сценарий, который реагирует на нажатие клавиши?

    Как проверить, были ли созданы предупреждающие баннеры в сценарии оболочки

    Получить IP-адрес для NetBios name

    Почему sh отображает ошибку, если bash не работает?

    Linux и Unix - лучшая ОС в мире.