No error if existing make parent directories as needed перевод

Мы уже сталкивались с различными командами, их параметрами и аргументами. Попробуем разобраться как все устроено.

Мы уже сталкивались с различными командами, их параметрами и аргументами. Попробуем разобраться как все устроено.

Введенное что-либо в командной строке воспринимается как инструкция к выполнению. Она может быть как указанием к запуску другой программы, так и внутренней командой Linux Shell (мы работает с программой bash в качестве командной строки). Для нас в большинстве случаев важен лишь результат исполнения.

Команды Linux Shell можно поделить на 4 группы:

  1. Исполняемая программа. В качестве примера можно взять любой файл из директории /usr/bin. Программы могут быть представлены в виде скомпилированных двоичных файлов или текстовых скриптов. Они дают возможность расширения набора доступных возможностей (команд) при установке новых приложений или разработке собственных.
  2. Внутренняя команда Linux Shell. В самой программе, выполняющей функции Linux Shell (в нашем случае программа bash) имеется фиксированный набор своих команд. В отличии от исполняемых программ, они позволяют изменять настройки Linux Shell. Например, при помощи команды cd можно изменить рабочую директорию.
  3. Внутренние функции Shell. Это миниатюрные скрипты, включаемые в окружение внутри Linux Shell. Пока мы с ними еще не сталкивались. Подробно мы познакомимся с ними в материалах программирования и разработки скриптов для Linux Shell.
  4. Псевдонимы или алиасы. Это команды, которые можно задать на основе других доступных команд.
  5. Управляющие конструкции. Являются частью языка Shell для написания инструкций и управляют выполнением команд. Подробно мы познакомимся с ними в материалах программирования и разработки скриптов для Linux Shell.

Разморозим виртуальную машину и познакомимся с командами поближе 🙂

Определение типа команд

Если мы знаем только имя команды, но не знаем с чем столкнулись и нам любопытно узнать, то можно воспользоваться командой type, которая определит тип интересуемой нас команды. Для этого после команды type указывается имена интересуемых команд. Сама команда type является внутренней командой Linux Shell (программы bash). Убедимся в этом.

Попробуем опытным путем получить информацию по ранее известным нам командам cd, pwd, ls, less, file, mkdir, rmdircp, mv, rm и kshkqskskjskafege (первая команда, которую мы ввели).

[[email protected] ~]$ type cd pwd ls less file mkdir rmdir cp mv rm kshkqskskjskafege

cd is a shell builtin

pwd is a shell builtin

ls is aliased to `ls —color=auto’

less is hashed (/usr/bin/less)

file is hashed (/usr/bin/file)

mkdir is hashed (/usr/bin/mkdir)

rmdir is hashed (/usr/bin/rmdir)

cp is hashed (/usr/bin/cp)

mv is hashed (/usr/bin/mv)

rm is hashed (/usr/bin/rm)

bash: type: kshkqskskjskafege: not found

Как мы видим, команды cd и pwd, встроенные в Shell, less, file, mkdir, rmdircp, mv и rm — исполняемые программы из директории /usr/binls — псевдоним команды ls с ключом --color=auto (теперь мы знаем, почему папки выводятся синим цветом, а программы зеленым), а команды kshkqskskjskafege не существует.

Поиск исполняемого файла

Иногда бывает несколько разных версий выполняемой программы, установленной в разных местах. Для домашних компьютеров это несколько необычно, но на больших серверах совсем в порядке вещей. Чтобы определить точное расположение выполняемого файла по имени, существует команда which, После команды which следует указать имя интересуемой нас программы. Попробуем определить расположение программ less и rmdir.

Документация к командам

Зная название команды, можно попытаться поискать к ней документацию. Для этого есть различные инструменты.

Команда справки help

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

pwd: pwd [-LP]

    Print the name of the current working directory.

    Options:

      -L print the value of $PWD if it names the current working

     directory

      -P print the physical directory, without any symbolic links

    By default, `pwd’ behaves as if `-L’ were specified.

    Exit Status:

    Returns 0 unless an invalid option is given or the current directory

    cannot be read.

Параметр справки --help

Многие программы поддерживают ключ --help. При его использовании, программа выводит описание, доступные параметры и ожидаемые аргументы. Запросим справку у команды mkdir.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Usage: mkdir [OPTION]… DIRECTORY…

Create the DIRECTORY(ies), if they do not already exist.

Mandatory arguments to long options are mandatory for short options too.

  -m, —mode=MODE   set file mode (as in chmod), not a=rwx — umask

  -p, —parents     no error if existing, make parent directories as needed

  -v, —verbose     print a message for each created directory

  -Z, —context=CTX  set the SELinux security context of each created

                      directory to CTX

      —help     display this help and exit

      —version  output version information and exit

GNU coreutils home page: <http://www.gnu.org/software/coreutils/>

General help using GNU software: <http://www.gnu.org/gethelp/>

For complete documentation, run: info coreutils ‘mkdir invocation’

К сожалению, некоторые программы не поддерживают параметр --help. Но имеет смысл попытаться таким образом получить информацию о программе, если иных возможностей нет. В большинстве случаем, когда ключ --help не распознан программой, программа выведет сообщение об ошибке и отобразит информацию по её использованию, которая нас интересует.

Страницы руководства

Большинство программ, предназначенных для работы с интерфейсом командной строки, снабжены формальной документацией, называемой руководством по использованию. Для её поиска и просмотра в Linux присутствует специальная программа man. Чтобы получить информацию по интересуемой нас программе или файлу, после команды man следует указать имя команды или файла. Для отображения самой документации программа man запускает инструмент просмотра файлов (обычно это знакомая нам программа less). Почитаем руководство по использованию команды rmdir (для выхода из less после окончания чтения нажмем на клавиатуре клавишу «q»).

Руководство по использованию команды rmdir

Теперь мы знаем где искать информацию по незнакомым и знакомым командам 🙂

А пока вновь заморозим виртуальную машину и дадим ей отдохнуть немножко.

15 ответов

Попробуйте mkdir -p:

mkdir -p foo

Обратите внимание, что это также создаст любые промежуточные каталоги, которые не существуют; например,

mkdir -p foo/bar/baz

создаст каталоги foo, foo/bar и foo/bar/baz если они не существуют.

Некоторые реализации, такие как GNU mkdir включают в себя mkdir --parents как более читаемый псевдоним, но это не указано в спецификации POSIX/Single Unix, поэтому этого следует избегать.

Если вам нужна ошибка, когда родительские каталоги не существуют, и вы хотите создать каталог, если он не существует, то вы можете сначала test существование каталога:

[ -d foo ] || mkdir foo

Brian Campbell
27 апр. 2009, в 16:25

Поделиться

Это должно работать:

$ mkdir -p dir

или

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

который создаст каталог, если он не существует, но предупредите, если имя создаваемого вами каталога уже используется чем-то другим, кроме каталога.

Alnitak
27 апр. 2009, в 15:56

Поделиться

Используйте флаг -p.

man mkdir
mkdir -p foo

jimmyorr
27 апр. 2009, в 16:43

Поделиться

Определение сложных деревьев каталогов с помощью одной команды

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

Oleg
21 авг. 2013, в 20:53

Поделиться

Если вы не хотите показывать сообщение об ошибке:

[ -d newdir ] || mkdir newdir

Если вы хотите показать свое собственное сообщение об ошибке:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

Jahid
27 март 2015, в 04:30

Поделиться

Старый проверенный и достоверный

mkdir /tmp/qq >/dev/null 2>&1

будет делать то, что вы хотите, ни в одной из условий гонки, из-за чего многие другие решения не имеют.

Иногда самые простые (и самые уродливые) решения являются лучшими.

paxdiablo
27 апр. 2009, в 15:10

Поделиться

mkdir foo работает, даже если каталог существует.
Чтобы он работал, только если каталог с именем «foo» не существует, попробуйте использовать флаг -p.

Пример: —

mkdir -p foo

Это создаст каталог с именем «foo», только если он не существует.:)

Atul Ranjan
20 янв. 2014, в 13:51

Поделиться

directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

Visuwa Bharathi K
16 дек. 2015, в 13:11

Поделиться

mkdir больше не поддерживает -p в системах Windows 8+.

Вы можете использовать это:

IF NOT EXIST dir_name MKDIR dir_name

Karanvir Kang
22 нояб. 2016, в 14:34

Поделиться

Или если вы хотите сначала проверить наличие:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e — это существующий тест для оболочки korn.

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

alkar
27 апр. 2009, в 16:28

Поделиться

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

1) dir =/home/dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) Для создания каталога вы можете использовать mkdir с опцией -p. Он проверит, если каталог не доступен, он будет.

mkdir -p $dir

mkdir -p также позволяет создавать древовидную структуру каталога. Если вы хотите создать родительский и дочерний каталоги с помощью одной и той же команды, можете выбрать mkdir -p

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

AbhinavVaidya8
21 авг. 2018, в 05:47

Поделиться

Это простая функция (оболочка bash), которая позволяет вам создавать каталог, если он не существует.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

Вы можете вызвать вышеуказанную функцию как:

createDirectory/tmp/fooDir/BarDir

Приведенное выше создает fooDir и BarDir, если они не существуют. Обратите внимание на параметр «-p» в команде mkdir, которая рекурсивно создает каталоги. Надеюсь это поможет.

Balaji Boggaram Ramanarayan
14 фев. 2018, в 20:06

Поделиться

Ссылаясь на man-страницу man mkdir для опции — p

   -p, --parents
          no error if existing, make parent directories as needed

который создаст все каталоги по заданному пути, если существует, не выдаст ошибку, иначе он создаст все каталоги слева направо по заданному пути. Попробуйте команду ниже. каталоги newdir и anotherdir не существует до выдачи этой команды

Правильное использование

mkdir -p/tmp/newdir/anotherdir

После выполнения команды вы можете увидеть newdir и еще один anotherdir созданный в /tmp. Вы можете выполнить эту команду столько раз, сколько захотите, команда всегда имеет exit(0). По этой причине большинство людей используют эту команду в сценариях оболочки перед использованием этих реальных путей.

vkrams
21 янв. 2019, в 23:49

Поделиться

mkdir -p sam
  • mkdir = Создать каталог
  • -p = — -p arents
  • (без ошибок, если есть, создайте родительские каталоги по мере необходимости)

Paritosh Yadav
20 апр. 2018, в 10:06

Поделиться

Следующий код вызовет все ошибки, кроме ошибки «dir уже существует». Он также потерпит неудачу, если файл с именем «dirName» уже существует:

import subprocess

dirName='myNewDir'

failed=subprocess.call(['mkdir', '-p', dirName])

if failed !=0: raise Exception, 'Failed to create dir %s.'%(dirName)

Кроме того, он будет создавать каталоги рекурсивно, т.е.

dirName='./dir1/dir2'

создаст как «dir1», так и «dir2»

JAZS
04 дек. 2017, в 21:04

Поделиться

Ещё вопросы

  • 1Почему просмотр списка Android иногда исчезает после вызова запроса на базовом курсоре?
  • 0Не удается использовать ngDialog из-за TypeError: ngDialog.open не является функцией в Scope. $ Scope.discountModalOpen?
  • 1Ошибка автоматического перехода на следующую страницу в приложении Магазина Windows
  • 0как работает bufferedPercent
  • 0получение значений с помощью метода post из клонированного поля
  • 0Изменение размера divs ширина и высота в браузере изменить размер с помощью CSS
  • 1Аудио запись
  • 1Макет чата с менеджером BoxLayout
  • 1WooCommerce Rest API Oauth с Javascript
  • 1Как проверить состояние соединения с базой данных?
  • 0Странный ответ с Xcode и HTTP-запросом
  • 1WPF Animation останавливается самопроизвольно
  • 1Отслеживание функций в питоне
  • 1Как получить системный десятичный разделитель с помощью JavaScript в Google Chrome?
  • 0AngularJS Предварительная настройка фильтра
  • 0Один ng-options зависит от того, что выбрано в другом — AngularJS
  • 1Как сохранить изображение, загруженное через url, в базу данных sqlite в двоичном формате
  • 1Разве shutil.copyfile не должен заменять ссылку в dst с установленным follow_symlinks?
  • 1Извлечь тип объекта из строки формата
  • 0Как избежать записи файла ядра и ускорить генерацию трассировки
  • 0Программно войти на сайт SSL с помощью cURL и PHP
  • 0Управлять результатами, хранящимися в «обещании»
  • 0Неразрешенное включение
  • 0API Node.js с express & mysql — переопределить извлеченные параметры для правильного поиска в столбце
  • 1C # Ожидание окончания делегата, прежде чем продолжить
  • 0ОШИБКА 1215. MySql InnoDB
  • 1Как заставить замолчать предупреждение «NewInstance» устарело «в` node-gyp rebuild`? Какая альтернатива NewInstance в v8?
  • 1Python: numpy, pandas и выполнение операций над предыдущим значением массива (сглаженные средние): есть ли способ не использовать цикл FOR? EWMA?
  • 0Перетащите и коснитесь других элементов div
  • 1Как удалить файлы в AppData / Temp после загрузки файла с помощью .NET WebAPI 2? Ошибка файла в использовании
  • 0Предупреждение jQuery при выходе с сайта
  • 0Решить рекомендацию JSHint «Не использовать« с »»
  • 1Проверка NetworkAvailability возвращает false, но телефон подключен
  • 0Как добавить HTML / CSS с помощью редактора на DNN? Как добавить разметку, не полагаясь на модули?
  • 1Как получить ключ и значение dict [duplicate]
  • 0Ошибка определения шаблона переменной функции
  • 1Где я могу разместить свои файлы Python в папке venv?
  • 0Как вы определяете глобальные переменные, чтобы все классы могли обращаться к ним / редактировать?
  • 0VB Script не будет работать в моем приложении HTA… только экран становится белым
  • 1Как получить последний элемент в массиве Node.js? [Дубликат]
  • 0Как прочитать содержимое HTML в about: в браузере Firefox?
  • 0FeathersJS REST возвращает записи с определенным значением
  • 0Как мы можем определить, когда модель вернулась к своему первоначальному значению?
  • 1Лучшая стратегия для реализации этого поведения в Android-приложении?
  • 0Сначала отсортируйте строки, затем добавьте временный столбец автоинкремента в MySQL.
  • 1Вопрос по .asec (шифрование) на Froyo 2.2 / установка приложения на SDCard
  • 1Невозможно передать переменную в функцию typewrite в python
  • 1Что может быть более быстрым способом генерации матрицы, в которой хотя бы один элемент ненулевой в строке?
  • 1Несколько целочисленных входов в одной строке Python
  • 1панель навигации Android

На одной из наших удаленных систем происходит сбой mkdir -p $directory, когда каталог существует. что означает, что это показывает

mkdir: невозможно создать каталог ‘$ directory’: файл существует

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

Во всех этих системах есть пользователь test и directory=/home/test/tmp.

4 ответа

Лучший ответ

Это может быть вызвано тем, что в каталоге уже есть файл с таким же именем.

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


44

Neuron
18 Янв 2021 в 16:31

Проверьте, есть ли файл (не каталог) с таким же именем, как $ directory.


4

DWright
24 Янв 2013 в 12:35

Mkdir -p не будет создавать каталог, если в том же каталоге существует файл с таким же именем. В противном случае все будет работать должным образом.


2

ASHU
24 Янв 2013 в 18:30

Возможно, ваш каталог был подключен к сети на основе FUSE?

Помимо файла с таким именем, который уже существует (другой ответ), это может произойти, когда процесс FUSE, который когда-то монтировал что-то в этом каталоге, дал сбой (или был убит, например с kill -9 или через Linux OOM killer).

Чтобы увидеть, что происходит в деталях, запустите strace -fy mkdir -p $directory, который показывает все задействованные системные вызовы и их возвращаемые значения.


Я считаю сообщения об ошибках, выдаваемые в этом случае, ошибкой в ​​mkdir -p (в частности, в библиотеке gnulib):

Когда вы запускаете его в каталоге, в котором был смонтирован процесс FUSE, но этот процесс разбился, он говорит

mkdir: cannot create directory ‘/mymount’: File exists

Что довольно неточно, потому что базовый вызов stat() возвращает ENOTCONN (Transport endpoint is not connected); но mkdir распространяет менее конкретную ошибку из предыдущий mkdir() sycall. Это сбивает с толку, потому что на странице руководства написано:

   -p, --parents
          no error if existing, make parent directories as needed

Так что ошибки не должно быть, если каталог существует, но ls -l / показывает:

d????????? ? ?    ?       ?            ? files

Поэтому согласно этому (d), это каталог, но это не согласно test -d.


Я считаю, что лучшим сообщением об ошибке (которое в этом случае должен выдавать mkdir -p) было бы:

mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected


1

nh2
14 Дек 2018 в 23:29

Вопрос:

В одной из наших удаленных систем mkdir -p $directory завершается сбой при наличии каталога. что означает, что он показывает

mkdir: невозможно создать каталог ‘$ directory’: файл существует

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

на всех этих системах есть пользователь test и directory=/home/test/tmp.

Лучший ответ:

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

Изменить: обратите внимание, что каталог не может содержать файлы и папки с одинаковым именем на машинах Linux.

Ответ №1

Проверьте, есть ли файл (а не каталог) с именем, аналогичным $directory.

Ответ №2

mkdir -p не будет создавать каталог, если в том же каталоге существует файл с тем же именем. В противном случае он будет работать, как ожидалось.

Ответ №3

Был ли ваш каталог сетевым монтированием FUSE -based случайно?

В дополнение к файлу с таким именем уже существует (другой ответ), это может произойти, когда процесс FUSE, который когда-то монтировал что-то в этом каталоге, аварийно kill -9 (или был уничтожен, например, с помощью kill -9 или через убийцу Linux OOM).

Чтобы увидеть, что происходит в деталях, запустите strace -fy mkdir -p $directory, которая показывает все задействованные системные вызовы и их возвращаемые значения.


Я считаю сообщения об ошибках, генерируемые в этом случае, ошибкой в mkdir -p (в частности, в библиотеке gnulib):

Когда вы запускаете его в директории, в которой смонтирован процесс FUSE, но этот процесс завершился сбоем, он говорит

mkdir: cannot create directory ‘/mymount: File exists

что весьма неточно, потому что основной вызов stat() возвращает ENOTCONN (Transport endpoint is not connected); но mkdir распространяет менее специфическую ошибку из предыдущего вызова mkdir(). Это очень запутанно, потому что на странице руководства написано:

   -p, --parents
no error if existing, make parent directories as needed

поэтому он не должен ls -l/ ошибку, если ls -l/ существует, но ls -l/ показывает:

d????????? ? ?    ?       ?            ? files

таким образом, согласно этому (d), это каталог, но он не соответствует test -d.


Я считаю, что лучшим сообщением об ошибке (которое mkdir -p должен mkdir -p в этом случае) будет:

mkdir: cannot create directory ‘/mymount: Transport endpoint is not connected

640?wx_fmt=jpegЧтобы эффективно работать в командной строке Linux, вам нужно использовать несколько приемов. -Сандра Генри-Стокер

Для полезных ссылок на оригинальный текст, пожалуйста, посетите
Оригинальная ссылка«Получите интерактивные ссылки, полноразмерные оригиналы и соответствующие статьи.

Подтверждения
Составлено из |
https://www.networkworld.com/article/3305811/linux/linux-tricks-that-even-you-can-love.html
 

Автор | Сандра Генри-Стокер

Переводчик | Хэнк Чоу (HankChow) ?? Всего переводов:8.0Срок публикации статьи: 303 дня

Чтобы эффективно работать в командной строке Linux, вам нужно использовать несколько приемов.

Гениальные навыки командной строки Linux могут сэкономить ваше время, избежать ошибок и позволить вам запоминать и повторно использовать сложные команды, концентрируясь на том, что нужно сделать, а не на том, как вы хотите это сделать. Вот несколько полезных советов командной строки.

Редактирование команд

Если вы хотите изменить введенную команду, вы можете использовать^actrl + a) Или^ectrl + e) Быстро переместите курсор в начало команды или в конец команды.

Вы также можете использовать^Символ для замены текста предыдущей команды и повторного выполнения команды, например^before^after^Эквивалент предыдущей командеbeforeЗаменено наafterЗатем выполните это снова.


  1. $ eho hello world  <== Неправильная команда

  2. Command 'eho' not found, did you mean:

  3. command 'echo' from deb coreutils

  4. command 'who' from deb coreutils

  5. Try: sudo apt install <deb name>

  6. $ ^e^ec^        <== замещать

  7. echo hello world

  8. hello world

Войдите в систему, используя имя удаленной машины.

Если вы используете командную строку для входа на другой компьютер, рассмотрите возможность добавления псевдонима. В псевдониме вы можете ввести имя пользователя (которое может совпадать или отличаться от имени пользователя в локальной системе) и информацию для входа на удаленный компьютер. Например, используяserver_name ='ssh -v -l username IP-address'Псевдоним команды как это:


  1. $ alias butterfly=”ssh -v -l jdoe 192.168.0.11

Это также можно найти на/etc/hostsДобавьте запись в файл или добавьте запись разрешения на DNS-сервер, чтобы заменить IP-адрес запоминающимся именем машины.

выполнениеaliasКоманда может перечислить псевдонимы уже на машине.


  1. $ alias

  2. alias butterfly='ssh -v -l jdoe 192.168.0.11'

  3. alias c='clear'

  4. alias egrep='egrep --color=auto'

  5. alias fgrep='fgrep --color=auto'

  6. alias grep='grep --color=auto'

  7. alias l='ls -CF'

  8. alias la='ls -A'

  9. alias list_repos='grep ^[^#] /etc/apt/sources.list /etc/apt/sources.list.d/*'

  10. alias ll='ls -alF'

  11. alias ls='ls --color=auto'

  12. alias show_dimensions='xdpyinfo | grep '''dimensions:''''

Просто добавьте новый псевдоним~/.bashrcВ аналогичном файле вы можете заставить псевдоним вступать в силу сразу после каждого входа в систему.

Заморозить и разморозить интерфейс терминала

^sctrl + s) Терминал прекратит вывод контента, выполнив команду управления потоком XOFF, которая повлияет на сеансы PuTTY и окна терминала рабочего стола. Если вы введете эту команду по ошибке, вы можете использовать^qctrl + q) Пусть терминал ответит снова. Так что просто помни^qЭтого сочетания клавиш достаточно, в конце концов, такая ситуация встречается редко.

Повторно использовать команду

Linux предоставляет пользователям много способов повторного использования команд, а главное — собирать выполненные команды через буфер истории. Самый простой способ повторно использовать команды — набрать!Затем возьмите первую букву последней использованной команды, конечно, вы также можете нажимать стрелку вверх на клавиатуре, пока не увидите команду, которую хотите использовать повторно, и затем нажать Enter. Вы также можете использоватьhistoryОтобразите историю команд, а затем введите!Далее следует номер рядом с командой в истории команд, которую необходимо использовать повторно.


  1. !! <== Повторно использовать предыдущую команду

  2. !ec <== Повторно использовать предыдущий ec Начало команды

  3. !76 <== Повторно использовать историю команд 76 Количество команд

Просмотр файлов журнала и динамическое отображение обновлений

Используйте формуtail -f /var/log/syslogКоманда может просматривать указанный файл журнала и динамически отображать добавленное содержимое в файле.Это очень полезно, когда вам нужно отслеживать события, которые добавляют содержимое в файл журнала. Эта команда выводит конец содержимого файла и постепенно отображает новый контент.


  1. $ tail -f /var/log/auth.log

  2. Sep 17 09:41:01 fly CRON[8071]: pam_unix(cron:session): session closed for user smmsp

  3. Sep 17 09:45:01 fly CRON[8115]: pam_unix(cron:session): session opened for user root

  4. Sep 17 09:45:01 fly CRON[8115]: pam_unix(cron:session): session closed for user root

  5. Sep 17 09:47:00 fly sshd[8124]: Accepted password for shs from 192.168.0.22 port 47792

  6. Sep 17 09:47:00 fly sshd[8124]: pam_unix(sshd:session): session opened for user shs by

  7. Sep 17 09:47:00 fly systemd-logind[776]: New session 215 of user shs.

  8. Sep 17 09:55:01 fly CRON[8208]: pam_unix(cron:session): session opened for user root

  9. Sep 17 09:55:01 fly CRON[8208]: pam_unix(cron:session): session closed for user root

  10.        <== Ожидание отображения дополнительного контента

Попросить помощи

Для большинства команд Linux вы можете добавить опции после ввода команды.--helpЧтобы получить функцию, использование и некоторую связанную информацию этой команды. В дополнение кmanВне порядка,--helpОпции позволяют вам получить то, что вам нужно, не используя все расширенные опции.


  1. $ mkdir --help

  2. Usage: mkdir [OPTION]... DIRECTORY...

  3. Create the DIRECTORY(ies), if they do not already exist.

  4. Mandatory arguments to long options are mandatory for short options too.

  5. -m, --mode=MODE set file mode (as in chmod), not a=rwx - umask

  6. -p, --parents no error if existing, make parent directories as needed

  7. -v, --verbose print a message for each created directory

  8. -Z set SELinux security context of each created directory

  9. to the default type

  10. --context[=CTX] like -Z, or if CTX is specified then set the SELinux

  11. or SMACK security context to CTX

  12. --help display this help and exit

  13. --version output version information and exit

  14. GNU coreutils online help: <http://www.gnu.org/software/coreutils/>

  15. Full documentation at: <http://www.gnu.org/software/coreutils/mkdir>

  16. or available locally via: info '(coreutils) mkdir invocation'

Удаляйте файлы с осторожностью

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


  1. $ rm -i    <== Запросить подтверждение

Закрыть псевдоним

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


  1. $ unalias rm

Если вы ужеrm -iНастройка по умолчаниюrmПсевдоним, но вам не нужно подтверждать перед удалением файла, вы можетеunaliasКоманда помещается в файл запуска (например,~/.bashrc) В.

Используйте sudo

Если вы часто забываете использовать команду, которая может быть выполнена только пользователем rootsudoЕсть два способа решить это. Одним из них является использование истории команд, вы можете использоватьsudo !!(Использование!!Чтобы запустить самую последнюю команду и добавить ее передsudo) Чтобы повторить реализацию, второй должен установить некоторые дополнительные необходимыеsudoПсевдоним команды.


  1. $ alias update=’sudo apt update

Более сложные трюки

Иногда трюк командной строки — это не просто псевдоним. В конце концов, единственное, что псевдоним может сделать для вас, это заменить команду и добавить некоторые параметры команды, что экономит время ввода. Но если вам нужны более сложные функции, чем псевдонимы, вы можете написать скрипт для.bashrcДобавить функции для достижения этого или других файлов запуска. Например, следующая функция перейдет в этот каталог после создания каталога. После настройки выполнитеsource .bashrcВы можете использоватьmd tempТакая команда для создания каталога сразу входит в этот каталог.


  1. md () { mkdir -p "[email protected]" && cd "$1"; }

резюме

Использование командной строки Linux является наиболее эффективным и интересным способом работы в системе Linux, но с навыками командной строки и умными псевдонимами вы можете получить лучший опыт.


via: https://www.networkworld.com/article/3305811/linux/linux-tricks-that-even-you-can-love.html

Автор:Sandra Henry-Stocker[2]Избранные темы:lujun9972Переводчик:HankChowКорректура:wxy

Эта статьяLCTTОригинальная подборка,Linux КитайЧесть запуск

To create a directory in Linux, you use the mkdir command. It stands for ‘make directory’ after all. It’s quite a simple command.

But, when you try to create a directory that already exists, you get an error like:

$ mkdir dir0
mkdir: cannot create directory ‘dir0’: File exists

This indicates that if a directory already exists, the mkdir command will not try to create or modify the already existing directory in any way.

But it also shows an error which is not what you always want especially if you are writing a bash script.

To prevent this error, use the -p flag along with mkdir command.

mkdir -p dirname

This way, though the directory is not created, it won’t show any error as well. Your scripts will run as usual.

💡

You’ll get the same error if a file or link exists with the same name as the directory you are trying to create. Why? Because everything is a file in Linux. A directory is a special file that acts like an index of all the files that are inside it.

Let’s see things in a bit more detail here and discuss various ways of preventing this error.

Method 1: Use ‘-p’ option

If you look at the manpage of the mkdir command, it has the ‘-p’ flag.

The use of ‘-p’ flag in mkdir is «no error if existing, make parent directories as needed».

When you use the ‘-p’ flag, the mkdir utility will check if a directory, file, link or pipe with the same name does not exist already.

If the does exist, it will not modify your existing directory or file, nor will it show an error message.

mkdir -p dirname
no output because there exists none

This is very handy when you are creating custom bash scripts and don’t want its execution to stop because of this error.

The -p can also be used to create a nested directory structure. If you want to create dir1/dir2/dir3 like directory structure and some or none of the directories exist in the hierarchy.

Method 2: Check if directory already exists in bash

If you are writing bash scripts, you can use the if condition and check if the directory already exists. If it doesn’t then you create the directory.

Here’s a sample code:

if [ -d my_dir ]
then
    mkdir my_dir
fi

Method 3: Send it to the void

A majority of UNIX tools have two output streams, stdout and stderr. Normally, both streams, stdout and stderr get printed to the terminal. But you can redirect either the normal output stream or the error stream to another file.

So, when the mkdir command throws an error to your terminal, you can redirect it to the void.

To redirect stdout, use it along with the ‘1’ numerical stream descriptor, for stderr, use the numerical stream descriptor ‘2’. You can also redirect stdin by using the ‘0’ stream descriptor.

To actually redirect the output, use the appropriate stream descriptor along with the redirection operator ‘>’

$ mkdir dir0 2> /dev/null

This will send the output of stderr to the ‘/dev/null’ device which discards anything that gets written to it.

This is totally safe to do. As I mentioned earlier, if the directory already exists, then it will not be modified. Only an error message will be shown. All you are doing here is suppressing that error message.

Personally, I would go with the first method i.e. using the mkdir -p command for ensuring that the directory is created only if there is no file or directory of the same name in the same location.

Team LHB

Team LHB indicates the effort of a single or multiple members of the core Linux Handbook team.

Понравилась статья? Поделить с друзьями:
  • No error handlers are registered logging exception traceback most recent call last
  • No error detail available перевод
  • No error detail available как открыть файл
  • No error cannot send scsi cmd via ioctl
  • No enum constant ошибка