Как удалить все каталоги с файлами определенного типа?

Если вы хотите скрыть весь вывод, вы можете перенаправить стандартный ввод и стандартный вывод:

find / -iregex ".*cpuinfo.*" >/dev/null 2>&1 &

Или с башом:

find / -iregex ".*cpuinfo.*" &>/dev/null &
2
23.07.2020, 07:13
2 ответа

GNUly, это может быть:

LC_ALL=C find. -name '*.svg' -type f -printf '%h\0' |
  LC_ALL=C sort -zu |
  xargs -r0 echo rm -rf

Где findсообщает имя каталога всех.svgобычных файлов, sort -zuудаляет дубликаты, а xargs rmудаляет их.

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

Обратите внимание, что если текущий каталог содержит .svgфайлы, rmоткажется удалять его (в качестве меры предосторожности rm -rf.для устранения неправильной функции в некоторых оболочках, где rm -rf.*включает .и ..в расширении.*).

Это можно обойти, заменив .на "$PWD"выше.

Удалите echo, когда будете уверены, что он будет делать то, что вы хотите.

С оболочкойboshвы могли бы сделать это более эффективно с помощью встроеннойfind:

has_svg() {
  find "$@" -maxdepth 1 -name '*.svg' -type f -call return 0 \;
  return 1
}

find. -type d -call 'has_svg "$1"' {} \; -prune -exec echo rm -rf {} +
2
18.03.2021, 23:17

Используя GNU find, мы используем find внутри find, чтобы сначала просмотреть каталог, начиная с нижних уровней, а затем проверить, содержит ли этот каталог хотя бы один файл.svg. Мы удаляем такие каталоги.

$ find. -depth  ! -name. -type d  \
    -exec sh -c '
      N=$#
      for d do
        test "x$(find "$d/." -maxdepth 1 -type f -name "*.svg" -print -quit)" != "x" &&
          set -- "$@" "$d"
      done
      shift "$N"; rm -rf ${1+"$@"}
 ' find-sh {} +
1
18.03.2021, 23:17

Теги

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