find. -maxdepth 1 -mindepth 1 ! -name build -exec rm -rf {} \;
-maxdepth 1
будет искать вещи только в текущей папке, а не на уровнях глубже.
-mindepth 1
обязательно исключит .
из списка файлов (, который обозначает текущий каталог ).
! -name build
будет следить за тем, чтобы не возвращались совпадения с именем, точно совпадающим с 'build'. Поэтому, если у вас есть папка с именем build1, она также будет удалена, если вы запустите эту команду.
-exec command {} \;
выполнит команду и напрямую передаст ей аргумент. Это также позволяет работать именам с пробелами и нечетными символами. \;
нужен в конце, чтобы find знал, что он достиг конца переданной вами команды.
Перед запуском команды, которая фактически выполнит удаление, вы должны запустить ее, чтобы убедиться:
find. -maxdepth 1 -mindepth 1 ! -name build -exec echo {} \;
Это просто отобразит все имена файлов и убедитесь, что у вас правильный синтаксис, прежде чем подставлять команду, которую вы хотите выполнить для каждого элемента.
Из-за исходного форматирования вашего вопроса казалось, что вам не хватает символа '#' в объявлении оболочки. Однако фактическая ошибка была вызвана отсутствием / в пути bash.
Это правильный способ определить вашу оболочку в скрипте bash:
#!/bin/bash
Помимо неправильного пути в хеш-банге, который является причиной ошибки, у вас также есть проблема с самой командой mkdir
.
Помните, что globs работают только для перечисления существующих файлов, поэтому все, что выглядит как mkdir /tmp/foo*
, просто передаст существующие каталоги в качестве аргументов mkdir
. Если /tmp/foo1
существует, он будет передан mkdir
, который затем сообщит, что он уже существует. Если/tmp/foo2
не существует , он будет не передан в mkdir
и не будет создан. Вам нужно будет сделать что-то еще, чтобы создать новые каталоги.
Неясно, какие каталоги вы хотите создать, но если вы хотите создать каталог testdoank
в каждом каталоге, соответствующем /tmp/report*/testfolder*
, то что-то вроде этого может сделать:
for dir in /tmp/report*/testfolder*; do
mkdir "$dir"/testdoank
done
Используйте
mkdir -p parentdir1/child1 par2/child2/grandchild2
Это создаст все вместе, дайте мне знать, если потребуется что-то более сложное