Список только подкаталогов -, содержащих два определенных файла

Я нашел решение своей проблемы, поэтому делюсь им.

Я определил контрольную группу customssh/limit, используя службу cgconfigиз libcgroup. Вот выдержка из моего cgconfig.confфайла:

group customssh/limit {
  perm {
    admin {
      uid=root;
      gid=root;
    }
    task {
      uid=myuser;
      gid=mygroup;
      fperm=775;
    }
  }
  cpu {
    cpu.shares=50;
  }
  memory {
    memory.limit_in_bytes="10G";
    memory.memsw.limit_in_bytes="10G";
    memory.soft_limit_in_bytes="2G";
  }
  devices {
    devices.deny="c 195:* rwm";
  }
}
  • fperm = 775позволяет пользователям группы mygroupиспользовать эту контрольную группу
  • Я ввожу ограничения на использование ЦП и памяти и запрещаю доступ к графическим процессорам с помощьюdevices.deny="c 195:* rwm";

Я создал файл /etc/profile.d/ssh.sh, который запускается при каждом входе в систему со следующим содержимым:

# check if the user is in a ssh session
if [[ -n $SSH_CONNECTION ]]; then
    # shell PID 
    SESSIONPID=$$
    # attach the shell to the `customssh/limit` cgroup
    cgclassify -g memory,cpu,devices:customssh/limit $SESSIONPID
    # all processes run by this shell will be affected
fi
6
11.05.2021, 16:43
4 ответа
find. -maxdepth 3 -name index.html -o -name Config_extra.js | 
  perl -lne '($dir,$base) = m:(^.*)/(.*$):;
             $dirs{$dir}++;
             END { foreach (sort keys %dirs) {print if $dirs{$_} == 2} }'

find выводит полный путь к файлам, соответствующим либо index.html, либо Config_extra.js. Это передается в perl-скрипт, который подсчитывает, сколько раз просматривается каждый каталог. После того, как все входные данные обработаны, он печатает каталоги, которые были просмотрены дважды.

Это основано на том факте, что команда findникогда никогда не выводит имя пути менее одного или более двух раз. Один раз, если/когда он соответствует index.htmlи/или один раз, если/когда он соответствует Config_extra.js.

Примерно такой же алгоритм в awk:

find. -maxdepth 3 -name index.html -o -name Config_extra.js | 
  awk '{
         sub("/[^/]+$","",$0);
         dirs[$0]++
       }

       END {
         for (i in dirs) {
           if (dirs[i] == 2) print i
         }
       }'
3
28.07.2021, 11:33

Вы можете использоватьfind -exec:

find. -maxdepth 3 -name 'index.html' -exec sh -c '
  [ -f "${f%/*}/Config_extra.js" ]' find-sh {} \; -printf "%h\n"

Если у вас большое дерево каталогов, использование -exec... +будет работать лучше:

find. -maxdepth 3 -name 'index.html' -exec sh -c '
  for f do
    d="${f%/*}"
    [ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
  done' find-sh {} +

Альтернативный поиск каталогов:

find. -maxdepth 2 -type d -exec sh -c '
  [ -f "$1/index.html" ] && [ -f "$1/Config_extra.js" ]' find-sh {} \; -print

или используя-exec... +

find. -maxdepth 2 -type d -exec sh -c '
  for d do
    [ -f "$d/index.html" ] && [ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
  done' find-sh {} +
5
28.07.2021, 11:33

Если вы ищете каталоги, используйте find, чтобы найти каталоги , а не файлы.

find. -type d -exec sh -c '[ -f "$1/index.html" ] && [ -f "$1/Config_extra.js" ]' sh {} \; -print

или, чтобы быть немного более эффективным, (вызывая sh -cкак можно меньше раз ),

find. -type d -exec sh -c '
    for dirpath do
        if [ -f "$dirpath/index.html" ] && [ -f "$dirpath/Config_extra.js" ]
        then
            printf "%s\n" "$dirpath"
        fi
    done' sh {} +

Любой из них будет находить и выводить пути к каталогам в текущем каталоге, содержащем как index.html, так и Config_extra.js, как обычные файлы или как символические ссылки на обычные файлы.

Добавьте дополнительные тесты и ограничения, если вам нужно (-maxdepth 2, например, можно добавить перед -typeтестом ).


Реализация find, которая поддерживает конкатенацию {}с какой-либо другой строкой в ​​аргументах -exec(, наиболее распространенные реализации поддерживают это ), может использовать

find. -type d \
    -exec [ -f "{}/index.html" ] \; \
    -exec [ -f "{}/Config_extra.js" ] \; -print
4
28.07.2021, 11:33

Еще один вариант:

find. -maxdepth 3 \( -name index.html -or -name Config_extra.js \) -printf "%h\n" | uniq -d

Найдите все совпадающие файлы (, имеющие любое имя ), распечатайте соответствующий каталог, затем используйте uniqдля поиска повторяющихся каталогов (, которые должны содержать оба файла ).

1
28.07.2021, 11:33

Теги

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