Grep and run команда в каждой папке, где файл содержал совпадение

Вместо этого используйте LVM. Это более гибко. Для чего угодно, кроме небольшой установки, вам определенно понадобится несколько файловых систем.

Причины включают:

  1. Если у вас есть неконтролируемый процесс, который пытается заполнить ваш диск, он будет содержаться в файловой системе. С единой файловой системой он может заполнить весь ваш диск.
  2. Если вы хотите выполнить переустановку, имеет смысл разместить пользовательские данные в отдельных файловых системах. Таким образом файловые системы пользовательских данных можно легко исключить из переустановки. Обычно это / home , как минимум .
  3. Иногда резервное копирование может быть более удобным, если у вас есть разные вещи в разных файловых системах. Например, вы можете захотеть "заморозить" файловую систему, например со моментальным снимком LVM или аналогичным. В в этом случае очевидно, что вы не можете разместить все в одной файловой системе.

Конкретные рекомендации:

  1. Размещайте пользовательские данные в отдельных разделах.
  2. Установите root (систему) в файловую систему, отдельную от всего остального, потому что вы не можете легко размонтировать root.
  3. Возможно, вы захотите поместить данные базы данных в ее собственную файловую систему, , потому что это может потребовать специальной обработки.
  4. Размещение виртуальных машин в отдельных файловых системах также является хорошей идеей, потому что вы часто можете создавать, изменять размер или уничтожать их.
0
21.01.2019, 11:18
2 ответа

find может работатьgrep:

find. -type f -name '*.out' \
    -exec grep -q -e 'pattern' {} \; \
    -execdir somescript.sh \;

Это позволит найти путь к любому обычному файлу, имя которого заканчивается на .out. Для каждого найденного пути он будет использовать grep, чтобы определить, соответствует ли шаблон какой-либо строке в файле. Если это так, -execdirиспользуется для выполнения somescript.shс каталогом найденного файла в качестве его рабочего каталога.

Обратите внимание, что somescript.shдолжен быть доступен где-то в $PATH, чтобы это работало, и что сценарий будет выполняться один раз для каждого найденного файла, а не один раз для каждого каталога, содержащего .outфайл с соответствовать.

Чтобы выполнить сценарий только один раз в каждом каталоге, содержащем .outфайл с совпадением:

find. -type d -exec sh -c '
    for dirpath do
        if grep -q -e "pattern" "$dirpath"/*.out 2>/dev/null; then
            ( cd "$dirpath" && exec somescript.sh )
        fi
    done' sh {} +

Это использует findдля поиска каталогов, а не файлов. Для найденных пакетов каталогов выполняется короткий сценарий оболочки -строки. сценарий оболочки пытается сопоставить шаблон со всеми .outфайлами в каждом каталоге (, исключая скрытые, в то время как findпо-прежнему будет искать скрытые каталоги ), и если какой-либо файл совпадает, запускается подоболочка, в которой меняется рабочий каталог и выполняется скрипт somescript.sh.

3
28.01.2020, 02:18

Если вы хотите запустить скрипт только один раз для каждого каталога, содержащего хотя бы один соответствующий outфайл, и не запускать по одному grepфайлу, вы можете выполнить:

P="pattern" find. -name '*.out' -type f -exec gawk '
  BEGINFILE {
    dir = FILENAME; sub("/[^/]*$", "", dir)
    if (dir in found) nextfile
  }
  $0 ~ ENVIRON["P"] {
    printf "%s\0", dir
    found[dir]
    nextfile
  }' {} + | xargs -r0 sh -c '
    for dir do
      (cd "$dir" && exec somescript.sh)
    done' sh

Это позволит запустить как можно меньше процессов и gawkпрочитать как можно меньше файлов (и как можно меньше каждого файла ).

Предполагается, что GNU xargsили совместимо, и что имена файлов не содержат последовательности байтов, которые не образуют допустимые символы в текущей локали.

С одним вызовом GNU grep(и GNU dirname, sort,xargs):

grep -rlZ --include='*.out' pattern. |
  xargs -r0 dirname -z |
  sort -zu |
  xargs -r0 sh -c '
    for dir do
      (cd "$dir" && exec somescript.sh)
    done' sh

В отличие от предыдущего решения, это будет искать во всех outфайлах, даже в тех каталогах, где уже были найдены соответствующие файлы. Поскольку GNU grepболее эффективен при поиске, чем gawk, он все же может быть более эффективным в зависимости от количества лишних данных, в которые он в конечном итоге будет входить.

1
28.01.2020, 02:18

Теги

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