Как удалить подпапки, содержащие только файлы определенного расширения

Если вы используете GNU/Linux, вы можете установить xbindkeysи запустить его в своем X-сеансе в файле ~/.xbindkeysrc:

"echo. > ~/.caps"
  Caps_Lock

Затем в вашем ~/.zshrc:

exec {CAPS_MONITOR}< <(tail -f ~/.caps 2> /dev/null)
caps-monitor() {
  if
    read <&$CAPS_MONITOR # consume the input
  then
    zle -R # redraw the prompt
    #zle -M "CapsLock pressed [$((++n))]" # uncomment to verify it works
  else
    zle -M "CapsLock handler dysfunctional, stopping the monitoring"
    zle -F $CAPS_MONITOR
  fi
}
zle -N caps-monitor
zle -wF $CAPS_MONITOR caps-monitor
1
20.12.2019, 20:59
2 ответа
#! /bin/bash
# recursively
shopt -s globstar || exit
# for every subfolder
for dir in **;do
      [[ ! -d $dir ]] && continue # if not directory then skip
      # SUBFOLDER name inspected
      echo "$dir"
      # count number of files in subfolder 
      NUMFILES=$(find "$dir" -type f | wc -l)
      # if non-empty folder
      if (( $(bc <<<"$NUMFILES > 0") )); then
      # if all files in folder have extension json, remove subfolder
              NUMJSON=$(find "$PWD/$dir" -iname '*.json' | wc -l)

              if (( $(bc <<<"$NUMFILES == $NUMJSON") )); then
                echo "rm -rf "$dir"" 
                rm -rf "$dir"
              fi
      fi
done
1
27.01.2020, 23:40

Следующий вкладыш решит вашу проблему:

sudo find. -links 2 -exec sh -c '[ "$(ls -l \{} | grep -c '^-')" \
-eq "$(ls \{} | grep -c '\.json$')" ]' \; -print0 | xargs -0  echo rm -rf {} + 2> /dev/null \;

Пояснение к коду:

sudo find. -links 2 

В текущем каталоге будут возвращены только конечные каталоги.

 ls -l \{} | grep -c '^-'

возвращает количество обычных файлов в каталоге.

 ls \{} | grep -c '\.json$'

возвращает количество файлов с расширением jsonв каталоге.

sh -c '[ "$(ls -l \{} | grep -c '^-')" -eq "$(ls \{} | grep -c '\.json$')" ]'

порождает вспомогательную оболочку -, которая возвращает true, если все файлы в каталоге имеют расширение json, что позволяет продолжить выполнение инструкции.

rm -rf {} + 2> /dev/null

удалит непустой -каталог, перенаправляющий стандартную ошибку на /dev/null.

Предупреждение :Это решение удалит найденные папки, не содержащие обычных файлов.

Сделайте резервную копию данных перед выполнением тестов.

Выполнить код в верхнем каталоге.

Удалите эхо, когда ваши тесты завершатся успешно.

0
27.01.2020, 23:40

Теги

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