Запуск через каталоги в Bash

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

Мне требуется script to cd в каталог, а затем удалять все, кроме нескольких файлов в подкаталогах, но оставлять только папки. Помогло бы оно использовать switch/case для каждого файла, который мне нужно сохранить?

В идеале я думаю, что он должен продолжать поиск дополнительных субдиров, вместо меня есть вложенные циклы, которые ищут только два уровня.

Другая проблема заключается в том, что она пропускает папки с пробелами (хотя это не проблема с томами, которые будут выполняться script).

Вот мой код:

for i in /Users/YourName/Desktop/Test/* ; do
  if [ -d "$i" ]; then
    cd $i

    for j in "$i"/* ; do
      if [ -d "$j" ]; then
        cd $j

        for k in $(ls *); do
          if [ ! $k == "watch.log" ]; then
            echo $k
            rm -rf $k
          fi
        done

      fi
    done

  fi
done

Спасибо!

Ответ 1

Как насчет этого?

$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete


Описание

  • -type: искать только файлы
  • -maxdepth: спуститесь на два уровня максимум
  • -not -name (комбо): исключить watch.log из поиска
  • -delete: удаляет файлы


Рекомендации

Попробуйте выполнить приведенную выше команду без флага -delete. Это напечатает список файлов, которые были бы удалены.

Как только вы дойдете до списка, добавьте -delete к команде.

Ответ 2

Вы должны использовать find:

for i in $(find . -type d)
do
    do_stuff "$i"
done

Если у вас действительно много каталогов, вы можете вывести вывод find в цикл while read, но он делает кодирование сложнее, поскольку цикл находится в другом процессе.

В пробелах обязательно укажите переменную, содержащую имя каталога. Это должно позволить вам правильно обрабатывать каталоги с пробелами в именах.

Ответ 3

Использование find? Вы можете использовать несколько параметров, включая глубину, возраст файла (как в stat), perms и т.д.

find . -maxdepth 2