Запуск через каталоги в 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