- Как mkdir только если dir еще не существует?
- 13 ответов
- Linux: копирование и создание целевого каталога, если он не существует
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Краткий ответ
- Как это работает?
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Ответ 16
- Ответ 17
- Ответ 18
- Ответ 19
- Как создавать каталоги в Linux (команда mkdir)
- Синтаксис команды Linux mkdir
- Как создать новый каталог
- Как создать родительские каталоги
- Как установить разрешения при создании каталога
- Как создать несколько каталогов
- Выводы
Как mkdir только если dir еще не существует?
Я пишу сценарий оболочки для запуска под KornShell (ksh) в AIX. Я хотел бы использовать mkdir команда для создания каталога. Но каталог может уже существовать, и в этом случае я не хочу ничего делать. Поэтому я хочу либо проверить, что каталог не существует, либо подавить ошибку «файл существует», что mkdir Выкидывает при попытке создать уже существующий каталог.
любые мысли о том, как лучше это сделать?
13 ответов
обратите внимание, что это также создаст все промежуточные каталоги не существуют; например,
будет создавать каталоги foo , foo/bar и foo/bar/baz если они не существуют.
если вы хотите ошибку, когда родительские каталоги не существуют, и хотите создать каталог, если он не существует, то вы можете test для существования каталога первый:
Это должно работать:
который создаст каталог, если он не существует, но предупредит вас, если имя каталога, который вы пытаетесь создать, уже используется чем-то другим, чем каталог.
определение сложных деревьев каталогов с помощью одной команды
Если вы не хотите показывать сообщение об ошибке:
Если вы хотите показать свое собственное сообщение об ошибке:
старый испытанный и истинный
будет делать то, что вы хотите, ни с одним из условий гонки многие другие решения не имеют.
иногда самые простые (и уродливые) решения являются лучшими.
mkdir foo работает, даже если каталог существует. Чтобы он работал, только если каталог с именем «foo» не существует, попробуйте использовать -p флаг.
это создаст каталог с именем «foo», только если он не существует. 🙂
или если вы хотите сначала проверить наличие:
— e — Это тест exist для оболочки korn.
вы также можете попробовать погуглить руководство по оболочке korn.
mkdir больше не поддерживает переключатель-p в системах Windows 8+.
вы можете использовать это:
вы можете использовать цикл if, чтобы проверить, существует ли каталог или нет, если он не выходит, чем создать каталог.
1) dir= / home / dir_name
2) Вы можете использовать каталог mkdir с опцией-p для создания каталога. Он будет проверять, если каталог недоступен, он будет.
команды mkdir -p также позволяет создать древовидную структуру каталога. Если вы хотите создать родительский и дочерний каталоги с помощью одной команды, можно выбрать mkdir — п
это простая функция (оболочка bash), которая позволяет создавать каталог, если он не существует.
вы можете вызвать вышеуказанную функцию как:
вышеизложенное создает fooDir и BarDir, если они не существуют. Обратите внимание на опцию»- p » в команде mkdir, которая рекурсивно создает каталоги. Надеюсь, это поможет.
Источник
Linux: копирование и создание целевого каталога, если он не существует
Мне нужна команда (или, возможно, опция cp), которая создает целевой каталог, если он не существует.
ОТВЕТЫ
Ответ 1
(нет такой опции для cp ).
Ответ 2
Если выполняется одно из следующих условий:
- Вы используете версию GNU cp (а не, например, версию Mac), и
- Вы копируете какую-либо существующую структуру каталогов, и вам просто нужно ее воссоздать
то вы можете сделать это с помощью флага —parents cp . На информационной странице (можно просмотреть http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation или с помощью info cp или man cp ):
Ответ 3
Краткий ответ
Чтобы скопировать myfile.txt в /foo/bar/myfile.txt , используйте:
Как это работает?
Вот несколько компонентов для этого, поэтому я покрою весь синтаксис шаг за шагом.
Утилита mkdir, как указано в стандарте POSIX, создает каталоги. Аргумент -p для каждого документа будет вызывать mkdir
Создайте любые отсутствующие компоненты промежуточного пути
означает, что при вызове mkdir -p /foo/bar mkdir создаст /foo и /foo/bar , если /foo еще не существует. (Без -p вместо этого он выдает ошибку.
Оператор списка && , как описано в стандарте POSIX (или Bash manual если вы предпочитаете), имеет эффект, что cp myfile.txt $_ запускается только в том случае, если mkdir -p /foo/bar выполняется успешно. Это означает, что команда cp не будет пытаться выполнить, если mkdir не удалось выполнить одну из многих причин, по которым она может потерпеть неудачу.
Наконец, $_ мы передаем как второй аргумент cp — это «специальный параметр», который может быть полезен для избежания повторения длинных аргументов (например, путей к файлам) без необходимости их хранения в переменной. Per руководство Bash, оно:
расширяется до последнего аргумента предыдущей команды
В этом случае, что /foo/bar мы перешли к mkdir . Таким образом, команда cp расширяется до cp myfile.txt /foo/bar , которая копирует myfile.txt во вновь созданный каталог /foo/bar .
Обратите внимание, что $_ не является частью стандарта POSIX, поэтому теоретически вариант Unix может иметь оболочку, которая не поддерживает эту конструкцию. Однако я не знаю никаких современных оболочек, которые не поддерживают $_ ; конечно Bash, Dash и zsh все делают.
Последнее замечание: команда, которую я дал в начале этого ответа, предполагает, что имена ваших каталогов не имеют пробелов. Если вы имеете дело с именами с пробелами, вам нужно процитировать их так, чтобы разные слова не рассматриваются как разные аргументы для mkdir или cp . Таким образом, ваша команда будет выглядеть так:
Ответ 4
Такой старый вопрос, но, возможно, я могу предложить альтернативное решение.
Вы можете использовать программу install для копирования вашего файла и создания пути назначения «на лету».
Есть несколько аспектов, которые следует принять во внимание:
- вам нужно указать также имя целевого файла, а не только путь назначения
- целевой файл будет исполняемым (по крайней мере, насколько я видел из своих тестов)
Вы можете легко изменить # 2, добавив параметр -m для установки разрешений для целевого файла (пример: -m 664 создаст целевой файл с разрешениями rw-rw-r— , так же, как создание нового файла с touch ).
Ответ 5
Функция оболочки, которая делает то, что вы хотите, называя ее копией «похоронить», потому что она выкапывает отверстие для файла, в котором он находится:
Ответ 6
Вот один из способов сделать это:
dirname предоставит вам родительский каталог или файл назначения. mkdir -p `dirname. ` затем создаст этот каталог, гарантирующий, что при вызове cp -r будет создан правильный базовый каталог.
Преимущество этих над -parents заключается в том, что он работает для случая, когда последний элемент в пути назначения является именем файла.
И он будет работать на OS X.
Ответ 7
install -D file -m 644 -t /path/to/copy/file/to/is/very/deep/there
Ответ 8
со всем уважением к ответам выше, я предпочитаю использовать rsync следующим образом:
Ответ 9
Просто чтобы возобновить и дать полное рабочее решение, в одну строку. Будьте осторожны, если вы хотите переименовать ваш файл, вы должны включить способ предоставить чистый путь к каталогу mkdir. $ fdst может быть файлом или каталогом. Следующий код должен работать в любом случае.
или специфичный для bash
Ответ 10
cp многократное использование:
@AndyRoss ответ работает на
стиль cp , но делает неправильную вещь, если вы используете
Я думаю, что «DEST» является неоднозначным без косой черты в этом использовании (то есть, когда целевой каталог еще не существует), и, возможно, именно поэтому cp никогда не добавлял опцию для этого.
Итак, вот моя версия этой функции, которая вводит косую черту в директорию dest dir:
Ответ 11
Просто добавьте следующее в свой .bashrc, настройте, если вам нужно. Работает в Ubuntu.
например Если вы хотите скопировать файл «test» в целевой каталог «d», Используйте
mkcp сначала проверит, существует ли каталог назначения, или нет, если нет, то сделайте это и скопируйте исходный файл/каталог.
Ответ 12
Это делает это для меня
Ответ 13
Я написал вспомогательный скрипт для cp, называемый CP (примечание заглавными буквами), который предназначен именно для этого. Скрипт проверит наличие ошибок в пути, который вы указали (за исключением последнего, который является пунктом назначения), и, если все в порядке, он выполнит шаг mkdir -p, чтобы создать путь назначения перед началом копирования. В этот момент обычная утилита cp вступает во владение, и все переключатели, которые вы используете с CP (например, -r, -p, -r pL, передаются напрямую в cp). Прежде чем использовать мой сценарий, необходимо кое-что понять.
- Вся информация здесь может быть доступна с помощью CP —help. CP —help — включает в себя cp-переключатели.
- обычный cp не сделает копию, если не найдет путь назначения. У вас нет такой системы безопасности для опечаток с CP. Ваш пункт назначения будет создан, поэтому, если вы неправильно опишите пункт назначения как /usrr/share/icons или /usr/share/icon, то, что будет создано.
- обычный cp имеет тенденцию моделировать его поведение на существующем пути: cp/a/b/c/d будет зависеть от того, существует d или нет. если d — существующая папка, cp скопирует в нее b, создав /c/d/b. Если d не существует, b будет скопирован в c и переименован в d. Если d существует, но является файлом, а b является файлом, он будет перезаписан копией b. Если c не существует, cp не делает копию и выходит.
СР не может позволить себе роскошь брать реплики с существующих путей, поэтому у него должны быть очень твердые модели поведения. CP предполагает, что копируемый вами элемент отбрасывается по пути назначения, а не сам пункт назначения (он же переименованная копия исходного файла/папки). Имея в виду:
- «CP/a/b/c/d» приведет к /c/d/b, если d — папка
- «CP/a/b/c/b» приведет к /c/b/b, если b в /c/b является папкой.
- Если оба b и d являются файлами: CP/a/b/c/d приведет к /c/d (где d — копия b). То же самое для CP/a/b/c/b в тех же обстоятельствах.
Это поведение CP по умолчанию можно изменить с помощью переключателя «- -r ename». В этом случае предполагалось, что
- «CP — -r ename/a/b/c/d» копирует b в /c и переименовывает копию в d.
Несколько заключительных замечаний: Как и в случае cp, CP может копировать несколько элементов одновременно, причем последний путь в списке считается местом назначения. Он также может обрабатывать пути с пробелами, если вы используете кавычки.
CP проверит введенные вами пути и удостоверится, что они существуют, прежде чем копировать. В строгом режиме (доступном через переключатель —strict) все копируемые файлы/папки должны существовать, иначе копирование не производится. В расслабленном режиме (- -r elaxed) копирование будет продолжено, если хотя бы один из перечисленных вами пунктов существует. Режим по умолчанию является расслабленным, вы можете изменить режим временно с помощью переключателей или навсегда, установив переменную easy_going в начале скрипта.
Вот как это установить:
В терминале, отличном от -r, выполните:
В gedit вставьте утилиту CP и сохраните:
Ответ 14
Просто была такая же проблема. Мой подход состоял в том, чтобы просто распаковать файлы в архив следующим образом:
tar cf your_archive.tar file1/path/to/file2 path/to/even/deeper/file3
tar автоматически сохраняет файлы в соответствующей структуре в архиве. Если вы бежите
tar xf your_archive.tar
файлы извлекаются в нужную структуру каталогов.
Ответ 15
Это может сработать, если у вас есть правильный тип rsync .
Ответ 16
Копировать из источника в несуществующий путь
ПРИМЕЧАНИЕ: эта команда копирует все файлы
cp –r для копирования всех папок и их содержимого
$_ работает как пункт назначения, который создается в последней команде
Ответ 17
должен сделать свое дело.
Ответ 18
Как предложено выше в help_asap и spongeman, вы можете использовать команду ‘install’, чтобы скопировать файлы в существующие каталоги или создать новые каталоги назначения, если они еще не существуют.
Вариант 1 install -D filename some/deep/directory/filename
копирует файл в новый или существующий каталог и дает файлу по умолчанию разрешение 755
Вариант 2 install -D filename -m640 some/deep/directory/filename
согласно варианту 1, но дает имени файла 640 разрешений.
Вариант 3 install -D filename -m640 -t some/deep/directory/
согласно варианту 2, но целевое имя файла помещается в целевой каталог, поэтому нет необходимости записывать имя файла как в исходном, так и в целевом.
Вариант 4: install -D filena* -m640 -t some/deep/directory/
согласно варианту 3, но использует подстановочный знак для нескольких файлов.
Он хорошо работает в Ubuntu и объединяет два шага (создание каталога, затем копирование файла) в один шаг.
Ответ 19
Скажем, вы делаете что-то вроде
где A/B/C/D — это каталоги, которые еще не существуют
Источник
Как создавать каталоги в Linux (команда mkdir)
В системах Linux вы можете создавать новые каталоги либо из командной строки, либо с помощью файлового менеджера вашего рабочего стола. Команда, позволяющая создавать каталоги (также известные как папки), — это mkdir .
В этом руководстве рассматриваются основы использования команды mkdir , включая повседневные примеры.
Синтаксис команды Linux mkdir
Синтаксис команды mkdir следующий:
Команда принимает в качестве аргументов одно или несколько имен каталогов.
Как создать новый каталог
Чтобы создать каталог в Linux, передайте имя каталога в качестве аргумента команды mkdir . Например, чтобы создать новый каталог newdir вы должны выполнить следующую команду:
Вы можете убедиться, что каталог был создан, перечислив его содержимое с помощью команды ls :
При указании только имени каталога без полного пути он создается в текущем рабочем каталоге.
Текущий рабочий каталог — это каталог, из которого вы запускаете команды. Чтобы изменить текущий рабочий каталог, используйте команду cd .
Чтобы создать каталог в другом месте, вам необходимо указать абсолютный или относительный путь к файлу родительского каталога. Например, чтобы создать новый каталог в каталоге /tmp вы должны ввести:
Если вы попытаетесь создать каталог в родительском каталоге, в котором у пользователя недостаточно прав, вы получите сообщение об ошибке Permission denied :
Параметр -v ( —verbose ) указывает mkdir печатать сообщение для каждого созданного каталога.
Как создать родительские каталоги
Родительский каталог — это каталог, который находится над другим каталогом в дереве каталогов. Чтобы создать родительские каталоги, используйте параметр -p .
Допустим, вы хотите создать каталог /home/linuxize/Music/Rock/Gothic :
Если какой-либо из родительских каталогов не существует, вы получите сообщение об ошибке, как показано ниже:
Вместо того, чтобы создавать недостающие родительские каталоги один за другим, вызовите команду mkdir с параметром -p :
Когда используется опция -p , команда создает каталог, только если он не существует.
Если вы попытаетесь создать каталог, который уже существует, а параметр -p не mkdir , mkdir выведет сообщение об ошибке File exists :
Как установить разрешения при создании каталога
Чтобы создать каталог с определенными разрешениями, используйте параметр -m ( -mode ). Синтаксис для назначения разрешений такой же, как и для команды chmod .
В следующем примере мы создаем новый каталог с разрешениями 700 , что означает, что только пользователь, создавший каталог, сможет получить к нему доступ:
Когда опция -m не используется, вновь созданные каталоги обычно имеют права доступа 775 или 755 , в зависимости от значения umask .
Как создать несколько каталогов
Чтобы создать несколько каталогов, укажите имена каталогов в качестве аргументов команды, разделенные пробелом:
Команда mkdir также позволяет создать сложное дерево каталогов с помощью одной команды:
Приведенная выше команда создает следующее дерево каталогов :
Выводы
Команда mkdir в Linux используется для создания новых каталогов.
Для получения дополнительной информации о mkdir посетите страницу руководства mkdir .
Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.
Источник