Вместо этого используйте LVM. Это более гибко. Для чего угодно, кроме небольшой установки, вам определенно понадобится несколько файловых систем.
Причины включают:
/ home
, как минимум
. Конкретные рекомендации:
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
.
Если вы хотите запустить скрипт только один раз для каждого каталога, содержащего хотя бы один соответствующий 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
, он все же может быть более эффективным в зависимости от количества лишних данных, в которые он в конечном итоге будет входить.