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

У меня была такая же проблема, но в Gparted я отключил устройство, после чего смог работать с ним, удалил раздел и создал новый идентичный. Теперь все в порядке.

1
задан 22 July 2015 в 14:48

5 ответов

Если вы не хотите рекурсировать, нет смысла использовать find. Это гораздо проще сделать непосредственно в оболочке:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */ найдет все каталоги (*/ гарантирует только каталоги и файлы не найдены); echo "$d" напечатает имя каталога; svnadmin verify "$d" проверит каталог.

Это можно запустить либо из командной строки, либо из сценария без изменения формата.

12
ответ дан 23 May 2018 в 18:52
  • 1
    Это похоже на лучший способ достичь моей цели, но я должен был дать ответ Фиксиману только потому, что мой заголовок и вопрос find так много. Спасибо за улучшение моих знаний! – Arronical 22 July 2015 в 15:35
  • 2
    Для этого требуется использование glob. Глобулизация определенно полезна & amp; мощным, но в моем личном опыте синтаксис сложнее настроить, и часто заканчивается необходимость в других вещах, таких как dotglob и globstar в bash, что создает более длинный и более сложный скрипт. Я стараюсь сохранять globs для больших сложных задач, тогда как синтаксис find проще сбрасывать вместе на лету, просто набивая вместе множество фильтров и команд в однострочный. – user5359531 22 July 2016 в 22:32
  • 3
    @ user5359531 ни globstar, ни dotglob (если вы не знаете, что у вас есть скрытые файлы и на самом деле их хотите) нужны здесь. Это, очевидно, вопрос мнения, но вы первый человек, с которым я когда-либо сталкивался, который считает довольно тупой формат find более простым. Я всегда предпочитаю globs над find, так как я не только нахожу их намного проще, но они также более безопасны при работе с произвольными именами файлов, которые передаются другим программам. – terdon♦ 22 July 2016 в 22:49
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Я добавил -type d, если это только каталоги.

6
ответ дан 23 May 2018 в 18:52
  • 1
    Я бы назвал {}, по крайней мере, в svnadmin verify {} – kos 22 July 2015 в 14:57
  • 2
    Спасибо за быстрый ответ. Итак, в этой команде -exec появляется дочерняя оболочка, в которой выполняются две команды, используя ; в качестве конца строки? – Arronical 22 July 2015 в 15:00

Попробуйте следующее:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Если вам просто нужны каталоги (спасибо @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
5
ответ дан 23 May 2018 в 18:52
  • 1
    Приятно, но это также обработает файлы: for f in */ будет обрабатывать только каталоги – kos 22 July 2015 в 15:03
  • 2
    Будет ли это работать только в скрипте? Или я могу его выдать в командной строке? – Arronical 22 July 2015 в 15:07
  • 3
    @Arronical будет работать также как командная строка – Maythux 22 July 2015 в 17:06
  • 4
    @kos еще раз спасибо за ваши заметки – Maythux 22 July 2015 в 17:06
Используйте . -maxdepth 1 вместо ./*, вам нужен только первый уровень в структуре папок. Используйте -type d, вам нужны только папки. Используйте ! -name ".", вам не нужно . Используйте -exec для Запустите оболочку Используйте sh -c для запуска команд внутри оболочки

Ваша команда

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

или короче

[d1 ] Используйте . -maxdepth 1 вместо ./*, вам нужен только первый уровень в структуре папок

Ваша команда

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
2
ответ дан 23 May 2018 в 18:52
  • 1
    @fedorqui Ницца, спасибо =) – A.B. 22 July 2015 в 15:42
  • 2
    -prune выглядит интересным. Я использовал ./* -maxdepth 0, чтобы не возвращать . из команды find. Это не вызывает критической ошибки, но я предпочитаю не иметь этого в своем выпуске. – Arronical 22 July 2015 в 16:13

Может быть полезно передать вывод find в цикл read:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Он позволяет выполнять более сложную сложную последовательность команд с именами файлов, возвращаемыми find, например в этом фантастическом примере ls:

find . | while read f; do echo ${f} | figlet -k; done
0
ответ дан 23 May 2018 в 18:52

Другие вопросы по тегам:

Похожие вопросы: