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

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

  • Как путь к поиску «человеческих» страниц задан?
  • Пути, относящиеся к компиляции из источника
  • Как найти именно этот исполняемый файл, который будет запущен, если это имя введено в командной строке?
  • zsh - полностью расширяет двоичный путь на вкладке <tab>
  • Проблема с прохождением пути, содержащего пробелы и скобки
  • Найти последнюю копию одного и того же файла в структуре папок
  • Скомпилировано, невозможно получить доступ к sudo
  • Команда moc не найдена?
  • 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

    Стандартный ввод данных Bash перед чтением

    Синхронизация миллионов файлов между двумя серверами Linux

    Как проверить, существует ли $ date1 до $ date2 в оболочке?

    Воспроизведение потока RTMP из командной строки

    find: обнаружен цикл файловой системы

    прокрутка сенсорной панели при переключении между физическим и виртуальным tty

    Есть ли разница в использовании ресурсов / потребностях между версиями Ubuntu и Debian Linux Mint (под тем же DE)?

    Установите mono и Monodevelop на новую рабочую станцию ​​Redhat 6.5

    Как отслеживать использование пользовательского диска в Linux

    автоматически создавать суб-интерфейсы VLAN, если они являются частью моста в файле / etc / network / interfaces

    Настроить dnssec с помощью dnsmasq, как я могу доверять общедоступному DNS Google?

    Каковы параметры «cpu» и «memory» в команде mount?

    Создание соединения ppp через 3G-модем как можно более стабильным

    Найти все видео по кодеку (а не по форматам контейнеров или MIME-типу)

    Уведомлять пользователя о блокировке учетной записи при входе в систему (Solaris)

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