Portál AbcLinuxu, 11. června 2024 17:47

Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)

23. 11. 2009 | David Watzke
Články - Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)  

Podrobnosti o práci s adresáři v postředí příkazové řádky. Jak adresáře vytvářet, mazat a jak se mezi adresáři přepínat a zjišťovat svou aktuální pozici.

Obsah

mkdir

link

Název příkazu mkdir vychází z anglického make directory, což znamená vytvořit adresář. To je také to, co příkaz dělá – vytváří adresáře. Nic víc, nic míň.

# vytvoří adresář s názvem "novy_adresar1"
mkdir novy_adresar1

Standard vyžaduje dostupnost dvou přepínačů. Přepínači -m lze jako argument zadat oprávnění, se kterými bude adresář vytvořen.

# vytvoří adresář s názvem "novy_adresar2" a právy 700 (drwx------)
mkdir -m 700 novy_adresar2

Druhý standardní přepínač -p slouží k vytvoření adresáře i za cenu nutnosti vytvoření nadřazených adresářů. Ukážeme si to na příkladu. Představte si, že chcete vytvořit adresář dir1 a v něm dir2 a v něm dir3. Máte dvě možnosti

# složitější verze
mkdir dir1 dir1/dir2 dir1/dir2/dir3

# kratší verze s použitím -p
mkdir -p dir1/dir2/dir3

Standard udává, že s přepínačem -p se pro každý neexistující nadřazený adresář spustí následující příkaz, který vytvoří adresář s výchozím oprávněním (dle umask) a přidá k němu právo zápisu a spouštění (wx) vlastníkovi.

mkdir -p -m $(umask -S),u+wx adresar

GNU verze příkazu má navíc přepínač -v (--verbose), se kterým vypíše informaci o každém vytvořeném adresáři.

mkdir -pv a/b/c/d
mkdir: created directory `a'
mkdir: created directory `a/b'
mkdir: created directory `a/b/c'
mkdir: created directory `a/b/c/d'

Dalším GNU přepínačem je -Z (--context), který slouží k nastavení bezpečnostního kontextu SELinuxu. Na systémech bez SELinuxu toto selže s tím, že operace není podporována.

Příkaz mkdir je dostupný i na OS/2 a operačních systémech od Microsoftu, kde se často používá zkrácený název md.


rmdir

link

Program rmdir má název vycházející z anglického slova remove directory, což znamená smazat adresář. Program smaže zadané adresáře, ale jen pokud jsou prázdné.

# smaže adresář s názvem "prázdný adresář" (pokud je skutečně prázdný)
rmdir "prázdný adresář"

# selže při mazání neprázdného adresáře
rmdir ~
rmdir: failed to remove `/home/dave': Directory not empty

Jediným standardizovaným přepínačem je -p, který slouží k mazání vnořených prázdných adresářů. Pro lepší představu toho, co se děje, do příkladu rovnou přidám přepínač -v, který je v implementaci od GNU dostupný pro výpis toho, co program dělá (tzn. které adresáře smazal).

rmdir -v -p a/b/c/d/
rmdir: removing directory, `a/b/c/d/'
rmdir: removing directory, `a/b/c'
rmdir: removing directory, `a/b'
rmdir: removing directory, `a'

Když program při mazání adresářů narazí na to, že některý z nich není prázdný, mazání se přeruší.

rmdir -v -p a/b/c/d/
rmdir: removing directory, `a/b/c/d/'
rmdir: removing directory, `a/b/c'
rmdir: removing directory, `a/b'
rmdir: failed to remove directory `a/b': Directory not empty

GNU rmdir má navíc ještě přepínač --ignore-fail-on-non-empty sloužící k ignoraci chyb způsobených čistě jen tím, že adresář není prázdný.

Příkaz rmdir je dostupný i na OS/2 a MS DOS/Windows, kde se často používá zkrácený název rd.


cd

link

Příkaz cd slouží ke změně aktuálního pracovního adresáře. Název vychází z anglického change directory, což znamená změnit adresář.

Jak jste patrně již zaregistrovali, cesty lze konzolovým programům zadávat relativně i absolutně. Relativní cesty se zadávají relativně právě k aktuálnímu pracovnímu adresáři (anglicky current working directory).

Jako argument se příkazu cd zadává cesta k novému pracovnímu adresáři.

# vstoupí do adresáře /home (existuje-li a máme-li k tomu právo)
cd /home

Dva standardizované přepínače -L-P určují, jak se příkaz postaví k symbolickým odkazům v cestě. Přepínač -L nenásleduje symbolické odkazy, dokud se nezpracují všechny skoky o adresář výše (tedy ..). Přepínač -P dělá přesný opak. Nejdříve následuje symlinky a teprve poté řeší všechny .. v cestě. Výchozí chování cd, pokud nezadáte -L ani -P je, jako kdybyste zadali -L, jinak platí poslední ze zadaných přepínačů. Matoucí? Ukážeme si příklady.

# představme si, že máme v adresáři /tmp …
cd /tmp
# … symbolický odkaz "houmko" ukazující na náš domovský adresář
ln -s ~ houmko

# teď máme dvě možnosti:
# 1) -L
cd houmko		# pracovní adresář bude /tmp/houmko
# 2) -P
cd -P houmko		# pracovní adresář bude ~

Ukážeme si to ještě na jedné složitější ukázce.

mkdir /tmp/abc          # vytvoří adresář /tmp/abc
cd /tmp/abc             # změní pracovní adresář na /tmp/abc
ln -s ~ def             # vytvoří symlink "def" odkazující na domovský adresář
cd def                  # změní pracovní adresář na /tmp/abc/def
mkdir ghi               # vytvoří adresář /tmp/abc/def/ghi (~/ghi)
cd ghi                  # změní pracovní adresář na /tmp/abc/def/ghi

# když teď spustíme následující…
cd -P ../..     # pracovní adresář bude /home

# ale když použijeme -L (nebo nic)…
cd ../..        # pracovní adresář bude /tmp/abc

Když cd zadáme místo názvu adresáře spojovník (-), změní pracovní adresář na předchozí hodnotu a vypíše cestu nově nastaveného pracovního adresáře.

cd -
# je tedy totéž jako
cd "$OLDPWD" && pwd

Nezadáme-li příkazu žádný argument, pracovní adresář se změní na domovský adresář.

# změní pracovní adresář na ~
cd

Příkaz cd zpravidla není program (nastavit pracovní adresář shellu přes jiný proces je běžným způsobem v podstatě nemožné), ale bývá vestavěným příkazem shellu.

Příkaz je dostupný nejen na Un*xech, ale i na MS DOS a Windows, OS/2, AmigaOS a dalších systémech.


pwd

link

Příkaz pwd slouží k vypsání aktuálního pracovního adresáře. Název pwd vychází z anglického výrazu print working directory, což znamená vypsat pracovní adresář.

$ cd /tmp       # jste-li v /tmp
$ pwd           # pwd vypíše /tmp
/tmp

Tento příkaz má stejné přepínače jako cd (-L-P, přičemž chování -L je výchozí), které mají stejný význam.

$ ln -s / /tmp/root
$ cd /tmp/root
$ pwd
/tmp/root
$ pwd -L
/tmp/root
$ pwd -P
/

Některé shelly implementují pwd po svém jako vestavěný příkaz. Alternativně je možné využít například /bin/pwd z GNU coreutils, který se ovšem (v době psaní článku) na mém systému nechová dle standardu, protože výchozí chování neodpovídá přepínači -L, ale -P. Samotné /bin/pwd mi totiž při použití v předchozí ukázce vypíše /, tzn. chybně následuje symlink.

Ekvivalentem pwd na MS DOS (COMMAND.COM) a Windows (cmd.exe) je cd (bez argumentů).

Seriál Unixové nástroje (dílů: 27)

První díl: Unixové nástroje – 1 (úvod, cat, head, tail), poslední díl: Unixové nástroje – 26 (triky pro práci v Bashi).
Předchozí díl: Unixové nástroje – 3 (mv, cp, rm)
Následující díl: Unixové nástroje – 5 (oprávnění: chmod, chown, chgrp)

Související články

Seriál: BASH
Regulární výrazy
Bash: chytré doplňování

Odkazy a zdroje

http://en.wikipedia.org/wiki/Mkdir
http://en.wikipedia.org/wiki/Rmdir
http://en.wikipedia.org/wiki/Cd_(command)
http://en.wikipedia.org/wiki/Pwd

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

23.11.2009 06:55 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Odpovědět | Sbalit | Link | Blokovat | Admin
Nevím jestli to je součást standardu ale mkdir -p navíc potlačuje kvákání v případě že už adresář existuje.
In Ada the typical infinite loop would normally be terminated by detonation.
Ruža Becelin avatar 23.11.2009 11:03 Ruža Becelin | skóre: 40 | blog: RuzaBecelinBlog
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Presneji receno rika - vytvor cilovy adresar a vsechny adresare k nemu vedouci, pokud uz neexistuji...
23.11.2009 13:22 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Odpovědět | Sbalit | Link | Blokovat | Admin
Při daném tématu by mohlo stát aspoň za zmínku pushd/popd.
24.11.2009 17:18 Liso
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Tak tato vec mi chybela uz pekne dlouho. Dokonce jsem si neco podobneho chtel napsat, ale tusil jsem, ze neni mozna aby toto uz nekdo neudelal. Diky moc
24.11.2009 17:39 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Ale to jsou vlastnosti shellu, nikoliv unixové nástroje.
In Ada the typical infinite loop would normally be terminated by detonation.
25.11.2009 17:40 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
To je cd take.
23.11.2009 19:46 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Odpovědět | Sbalit | Link | Blokovat | Admin
Dobré, netušil jsem že rmdir-p stejně jako mkdir, a to by se mi to zrovna nedávno hodilo.
Amarok avatar 26.11.2009 19:47 Amarok | skóre: 33 | blog: blogoblog
Rozbalit Rozbalit vše Re: Unixové nástroje – 4 (mkdir, rmdir, cd, pwd)
Odpovědět | Sbalit | Link | Blokovat | Admin

Dobry strucny prehled.

Stalo by ale za to u kazdeho parametru psat i anglicke slovo, napr. u mkdir -p (p = parents), me osobne se zkratky nejlip pamatuji prave kdyz vim, co zkratka znamena, i kdyz je to anglicky.

GNUniverse - May the source be with you...

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.