Массовое создание каталога с помощью mkdir в сценарии оболочки

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 {} \;

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

2
11.10.2019, 18:41
4 ответа

Сценарий оболочки должен начинаться с #!, а не просто !.

1
27.01.2020, 21:50

Из-за исходного форматирования вашего вопроса казалось, что вам не хватает символа '#' в объявлении оболочки. Однако фактическая ошибка была вызвана отсутствием / в пути bash.

Это правильный способ определить вашу оболочку в скрипте bash:

#!/bin/bash
3
27.01.2020, 21:50

Помимо неправильного пути в хеш-банге, который является причиной ошибки, у вас также есть проблема с самой командой 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
6
27.01.2020, 21:50

Используйте

mkdir -p parentdir1/child1 par2/child2/grandchild2

Это создаст все вместе, дайте мне знать, если потребуется что-то более сложное

0
27.01.2020, 21:50

Теги

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