ls
command je jedním z prvních příkazů, které se učíme při objevování shellu. A poté, ať už je úroveň vaší dovednosti jakákoli, zůstane jednou z nejčastěji používaných.
Navzdory této popularitě zřídka překračujeme -l
, -d
a -a
možnosti. Je to nešťastné, protože typický ls
implementace má k dispozici desítky možností! Proto vám navrhuji, abyste mě sledovali při hledání ls
příkaz skrytých drahokamů.
Ukázková hierarchie souborů, kterou používáme v této příručce příkazů ls
Než se dostaneme k jádru věci, potřebujeme se trochu připravit:bylo by těžké prostudovat ls
příkaz bez nějakého adresáře, se kterým by se dalo pracovat. Abyste si mohli na svém počítači vyzkoušet příkazy uvedené v tomto článku, zde je návod, jak vytvořit hierarchii ukázkových souborů, kterou použiji ve všech svých příkladech. Stačí zkopírovat a vložit tento seznam příkazů do vašeho terminálu a budete připraveni:
mkdir ls
cd ls
# Create a hidden file:
echo You can not see me > .hidden
# Create a couple of 2MiB files:
dd if=/dev/zero of=a bs=1M count=2
dd if=/dev/zero of=b bs=1M seek=1 count=1
# Create few sub-directories
mkdir -p dir/subdir dir/subdir2
# Create a bunch of empty files
touch c dir/{d,e,f} dir/subdir/{g,h,i} dir/subdir2/{j,k,l}
# Create few links (hard and symbolic)
ln dir/e hardlink-to-file
ln -s dir/f symlink-to-file
ln -s dir/subdir symlink-to-subdir
Pokud máte s těmito příkazy nějaké potíže, neváhejte použít sekci komentářů a požádat o pomoc. Za předpokladu, že je nyní vše v pořádku, je čas ponořit se do našeho hlavního tématu.
Známé případy použití příkazu ls
Protože každá cesta začíná prvním krokem, podívejme se nejprve na velmi základní případy použití ls
příkaz. Samozřejmě, pokud se považujete za odborníka, klidně rovnou skočte do pokročilejších sekcí. Ale pokud chceš zatím zůstat se mnou, skvělé:možná se něco naučíš!
<no option>
:výchozí chování
ls
příkaz poskytuje informace o všech objektech podobných souborům, na které ukazují cesty uvedené na příkazovém řádku. Při použití bez možnosti:
- jediná zobrazená informace je název objektu podobného souboru, na který ukazuje cesta;
- pokud tato cesta ukazuje na adresář (nebo symbolický odkaz na adresář),
ls
příkaz také vypíše obsah tohoto adresáře; - je-li zobrazeno několik položek, jsou seřazeny v abecedním pořadí podle názvu souboru.
Nakonec, když na příkazovém řádku není zadána žádná cesta, ls
příkazy předpokládá ./
–to je aktuální adresář.
Podívejme se nyní na všechna tato pravidla v akci:
# display the content of the current directory
sh:~/ls$ ls ./
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# without any option, `ls` is equivalent
# to `ls ./`
sh:~/ls$ ls
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# entries are sorted alphabetically
# ("dir/f" starts with a "d" so it is before "e")
sh:~/ls$ ls c b e dir/f a
a b c dir/f e
# when a command line argument is a directory
# (or a symbolic link to a directory)
# displays its content
sh:~/ls$ ls a b c link-to-subdir dir
a b c
dir:
d e f subdir subdir2
link-to-subdir:
g h i
-d
:neuvádět obsah adresáře
Pomocí -d
možnost, ls
již nezobrazuje obsah adresáře zadaného na příkazovém řádku, ale místo toho bude s položkami adresáře zacházet stejně jako se záznamy souborů. Porovnejme:
# Default behavior: display the content of the `dir` directory
sh:~/ls$ ls a dir b
a b
dir:
d e f subdir subdir2
# `-d` option: directories are handled like files
sh:~/ls$ ls -d a dir b
a b dir
Při použití -d
samotná možnost, mezi ls
není velký rozdíl a obyčejné echo
příkaz:
# In both case, the `*` glob pattern is expanded by
# the shell, which also takes care of
# sorting entries in the alphabetical order
sh:~/ls$ ls -d *
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
sh:~/ls$ echo *
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
Ale -d
volba se stává užitečnější, když je spojena s jinou možností pro zobrazení dalších informací, například při použití -l
příznak, který nyní uvidíme.
-l
:možnost dlouhého formátu
V ls
soutěž popularity voleb, -l
(malé písmeno ell) by pravděpodobně vyhrála. Je tak užitečný, že mnoho systémů nabízí ll
alias pro ls -l
(nebo ls -l<something>
)
-l
znamená dlouhý formát. S touto volbou ls
příkaz zobrazí každou položku na samostatném řádku obsahující následující informace:* režim souboru * počet odkazů * jméno vlastníka * název skupiny * počet bajtů v souboru * datum a čas * název cesty
Také pomocí -l
možnost, ls
již nebude následovat symbolické odkazy. Zobrazuje tedy informace (režim souboru, počet odkazů atd.) o samotném odkazu, nikoli o jeho cíli. Ze stejného důvodu ls
příkaz nezobrazí obsah adresářů označených symbolickými odkazy:
# Default behavior: displays only the filename and
# follows symbolic links:
sh:~/ls$ ls *
a b c e f hardlink-to-file symlink-to-file
dir:
d e f subdir subdir2
link-to-subdir:
g h i
symlink-to-subdir:
g h i
# `-l` option: displays extended informations and
# no longer follows symbolic links
sh:~/ls$ ls -l *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 c
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 12:09 f -> dir/f
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 12:09 link-to-subdir -> dir/subdir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 22:18 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 22:18 symlink-to-subdir -> dir/subdir
dir:
total 8
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 d
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 f
drwxr-xr-x 2 sylvain sylvain 4096 Sep 19 12:09 subdir
drwxr-xr-x 2 sylvain sylvain 4096 Sep 19 12:09 subdir2
Na závěr této části vás nechám prozkoumat výstup, který získáme kombinací obou -l
a -d
možnosti:
sh:~/ls$ ls -ld *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 19 12:09 dir
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 12:09 f -> dir/f
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 12:09 link-to-subdir -> dir/subdir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 22:18 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 22:18 symlink-to-subdir -> dir/subdir
-a
:zobrazit všechny soubory
Pomocí -a
možnost, ls
zahrnuje skryté soubory při zobrazení obsahu adresáře. Ale co je skrytý soubor?
Podle konvence je na systémech podobných Unixu soubor, jehož název začíná tečkou, považován za skrytý. Kromě toho každý adresář obsahuje také dvě speciální, obvykle skryté položky:.
a ..
V každém adresáři:
.
vstupní body do samotného adresáře. Takový druh odkazu na sebe se může zdát zvláštní. Ale někdy je to užitečné, trochu jako mít své vlastní telefonní číslo v seznamu smartphonů...
vstupní body do nadřazeného adresáře. Vzhledem k tomu, že hierarchie souborů na systémech podobných Unixu je přísně organizována jako strom, má každý adresář pouze jednoho rodiče. Kromě kořenového adresáře/
možná? Vlastně ne:rodič kořenového adresáře je … samotný kořenový adresář.
# Default behavior: do not display hidden entries
# (including . and ..)
sh:~/ls$ ls
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# `-a` option: show hidden files and directories
sh:~/ls$ ls -a
. a c e hardlink-to-file link-to-subdir symlink-to-subdir
.. b dir f .hidden symlink-to-file
Užitečné možnosti příkazu ls
Po přečtení dobře známého -l
, -d
a -a
možnosti, zaměřme svou pozornost na několik méně známých možností, které považuji za obzvláště užitečné.
-s
:zobrazení přidělené velikosti
Možná si pamatujete -l
volba zobrazila počet bajtů v souboru. -s
zobrazí přidělenou velikost v blocích. co je blok? Skupina bajtů, jejichž velikost je závislá na implementaci. Obvykle je to 512 bajtů na BSD a 1024 bajtů na Linuxu.
Proč bych se měl trápit s velikostí v blocích, když už mám přístup k velikosti v bajtech? No, -s
možnosti zobrazují přidělené velikost. Ne logické velikost souboru. U řídkých souborů to mohou být dvě zcela odlišné věci. Řídké soubory jsou soubory, které obsahují „díry“. Při čtení se tyto díry chovají jako normální bloky souborů obsahující pouze nuly. Na disku ale nezaberou prakticky žádné místo. Můžeme použít dd
pomocí příkazu seek
možnost vytvořit řídké soubory, jak jsem to udělal pro b
soubor v mé vzorové hierarchii:
sh:~/ls$ ls -ls a b
2052 -rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
1028 -rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
Jak můžete vidět, obě moje a
a b
soubory se zdají být dlouhé dva mebibajty. Ale b
Protože je soubor řídký, zabere pouze 1028 bloků na disku (zhruba jeden mebibajt).
-h
zobrazit velikosti čitelné pro člověka
Pomocí -h
možnost, ls
zobrazí velikosti souborů pomocí přípon jednotek, aby byly uživatelsky přívětivější. Tato volba má smysl pouze v kombinaci s -l
volba (Linux, BSD) nebo -s
(Linux):
sh:~/ls$ ls -lsh a b
2.1M -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 22:18 a
1.1M -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 22:18 b
openbsd-6.3$ ls -lsh a b
4128 -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 23:49 a
2112 -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 23:49 b
Možná jste si všimli, že velikosti se zobrazují pomocí mocnin 1024 jednotek, kde K znamená 2^10=1024 bajtů, M znamená 1024^2=1048576 bajtů a tak dále. Zde stojí za zmínku ls
implementace poskytovaná jako součást GNU Coreutils má navíc --si
možnosti použití mocniny 1000 místo mocnin 1024:
sh:~/ls$ ls -lsh --si a b
2.2M -rw-r--r-- 1 sylvain sylvain 2.1M Sep 19 22:18 a
1.1M -rw-r--r-- 1 sylvain sylvain 2.1M Sep 19 22:18 b
-i
zobrazit číslo inodu
Na souborovém systému unixového stylu číslo inodu (nebo sériové číslo souboru v terminologii POSIX) je číslo, které jednoznačně identifikuje objekt souborového systému (soubor, adresář, pojmenovaný kanál, …). Pomocí -i
možnost, ls
příkaz zobrazí své číslo inodu vedle každé cesty.
I když se to zdá poněkud exotické, zjistil jsem, že používám -i
čas od času, zejména k identifikaci položek adresáře, které odkazují na stejný objekt souborového systému. Tuto možnost využijete většinou při zkoumání pevných odkazů nebo připojení připojení. Podívejte se na toto video pro praktický příklad:https://youtu.be/Jp58Osb1uFo?t=140
sh:~/ls$ ls -i *
8222 a 8243 b 8262 c 8264 hardlink-to-file 8272 symlink-to-file
dir:
8263 d 8264 e 8265 f 8245 subdir 8261 subdir2
symlink-to-subdir:
8266 g 8267 h 8268 i
Ve výše uvedeném příkladu můžete vidět každý název souboru s předponou číslem inodu přidruženým k této cestě. Ve vašem systému se čísla budou jistě lišit. Každopádně se blíže podívejte na hardlink-to-file
a dir/e
záznamy. Oba mají stejné číslo inodu (v mém případě 8264). To znamená, že se jedná o dvě položky odkazující na stejný základní objekt souborového systému – což je ve skutečnosti přesná definice toho, co je pevný odkaz.
Možná si pamatujete, jak jsem již dříve řekl, že rodičem kořenového adresáře byl samotný kořenový adresář. Pomocí -i
možnost, je docela snadné toto tvrzení ověřit:
openbsd-6$ ls -id /
2 /
openbsd-6$ ls -ia /
2 . 25985 bin 5 dev 77954 sbin
2 .. 1235 boot 51969 etc 10 sys
8 .cshrc 1240 bsd 2 home 7 tmp
9 .profile 1241 bsd.booted 77953 mnt 2 usr
51968 altroot 4 bsd.rd 26016 root 78016 var
Jak můžete vidět, v mém systému je kořenový adresář spojen s inodem číslo 2, což je také inode jeho rodiče. To dokazuje, že kořenový adresář je svého vlastního rodiče.
Zřídka používané možnosti příkazu ls
Pravidelně používám možnosti popsané v předchozí části, ale ty, o kterých teď budu mluvit… no… vím, že existují. Nicméně musím přiznat, že když je potřebuji, často se musím podívat na man
osvěžit si paměť.
-L
:zobrazení informací o cíli symbolických odkazů
Tato volba upravuje chování ls
příkaz při použití na symbolické odkazy. Pomocí -L
možnost, ls
zobrazí informace o cíli symbolického odkazu namísto zobrazení odkazů souvisejících se samotným symbolickým odkazem. Zkoumáním následujícího příkladu bude rozdíl zřejmý:
# Pay special attention to the permission
# and file size for symbolic links with and without
# the `-L` option:
sh:~/ls$ ls -ld *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 5 Sep 20 00:09 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 20 00:09 symlink-to-subdir -> dir/subdir
[email protected]:/tmp/ls/ls/ls$ ls -lLd *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 symlink-to-file
drwxr-xr-x 2 sylvain sylvain 4096 Sep 20 00:09 symlink-to-subdir
-F
:přidat klasifikační znak k názvu souboru
-F
Tato volba přidává další znak za cestu k některým kategoriím objektů systému souborů, aby je bylo možné identifikovat. Přidá:
- a
\
za každou cestu, která je adresářem, - a
@
za každým názvem cesty, který je symbolickým odkazem, - a
*
po každém spustitelném souboru, - a
|
po každém FIFO (vizmkfifo
pro více informací o tom)
V mých raných dobách Unixu jsem tuto možnost hojně využíval. Ale protože ls
umí obarvit svůj výstup (a protože máme barevné monitory!), málokdy to potřebuji. Ale pamatuju si to. A čas od času na vzdáleném terminálu najdu příležitost to použít:
sh:~/ls$ ls -F
a b c dir/ hardlink-to-file [email protected] [email protected]
t
:řazení položek podle času úpravy
Pomocí -t
možnost, ls
příkaz se zobrazením položek adresáře seřazených podle času změny (nejnovější první) namísto řazení podle jejich názvu:
# Default sort order (by filename)
sh:~/ls$ ls
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
# Sort by modification date
sh:~/ls$ ls -t
symlink-to-subdir symlink-to-file c dir hardlink-to-file b a
Pokud změním soubor, zobrazí se nyní jako první (tj. naposledy upravený) záznam v seznamu:
sh:~/ls$ echo >> a
sh:~/ls$ ls -t
a symlink-to-subdir symlink-to-file c dir hardlink-to-file b
-S
:řazení položek podle velikosti
Pomocí -S
možnost, ls
zobrazí položky seřazené podle velikosti, největší soubor jako první. V případě shody jsou položky seřazeny podle názvu cesty:
sh:~/ls$ ls -lS
total 6244
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
-r
:obrácené pořadí řazení
Tato možnost obrátí pořadí řazení. Považuji jej za nejužitečnější, když je spojen s -t
možnost, aby se jako první zobrazil nejméně naposledy upravený soubor nebo s -S
možnost zobrazit nejdříve nejmenší soubor. Ale funguje také s výchozím pořadím řazení podle názvu cesty:
# Display the least recently modified file first
sh:~/ls$ ls -rt
b hardlink-to-file dir c symlink-to-file symlink-to-subdir a
# Display the smallest file first
sh:~/ls$ ls -rS
hardlink-to-file c symlink-to-file symlink-to-subdir dir b a
# Display path names in reversed alphabetical order
sh:~/ls$ ls -r
symlink-to-subdir symlink-to-file hardlink-to-file dir c b a
-n
:Zobrazení číselného UID/GID
Tato volba je přesně stejná jako -l
volba — kromě -n
ID skupiny vlastníka (GID) a ID uživatele (UID) se zobrazují jako čísla, nikoli jako přidružené jméno:
sh:~/ls$ ls -ld a b c /
drwxr-xr-x 28 root root 4096 May 6 00:28 /
-rw-r--r-- 1 sylvain sylvain 2097153 Sep 20 00:45 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
sh:~/ls$ ls -nd a b c /
drwxr-xr-x 28 0 0 4096 May 6 00:28 /
-rw-r--r-- 1 1000 1000 2097153 Sep 20 00:45 a
-rw-r--r-- 1 1000 1000 2097152 Sep 20 00:09 b
-rw-r--r-- 1 1000 1000 0 Sep 20 00:09 c
Opravdu exotické použití příkazu ls
Nikdo nemůže tvrdit, že ví všechno. A při psaní tohoto článku jsem (znovu) objevil pár ls
možnosti. Nepamatuji si, že bych je sám používal, ale možná vy ano? Pokud je tomu tak, rád bych si v sekci komentářů přečetl, za jakých okolností je považujete za užitečné. Každopádně zde je výběr, který by vás mohl zajímat.
-R
:rekurzivně seznam podadresářů
Ve výchozím nastavení ls
příkaz zobrazí pouze obsah adresářů výslovně uvedených na příkazovém řádku. Pomocí -R
možnost, bude také rekurzivně zobrazovat obsah nalezených adresářů:
sh:~/ls$ ls -R
.:
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
./dir:
d e f subdir subdir2
./dir/subdir:
g h i
./dir/subdir2:
j k l
Zatímco se zajímám o teorii, nacházím (zamýšlenou slovní hříčkou) výstup vytvořený find .
příkaz čitelnější pro tento účel. Ale váš počet najetých kilometrů se může samozřejmě lišit:
sh:~/ls$ find .
.
./c
./.hidden
./hardlink-to-file
./b
./symlink-to-subdir
./dir
./dir/d
./dir/e
./dir/subdir2
./dir/subdir2/l
./dir/subdir2/j
./dir/subdir2/k
./dir/subdir
./dir/subdir/g
./dir/subdir/i
./dir/subdir/h
./dir/f
./symlink-to-file
./a
-A
:zobrazit téměř všechny soubory
I když to není definováno ve standardu POSIX, -A
možnosti se objevují jak ve světě GNU, tak ve světě BSD. V obou případech to funguje jako -a
, ale s výjimkou .
a ..
záznamy. Stojí za zmínku o systémech BSD, -A
znamená pro superuživatele:
sh:~/ls$ ls -a
. a c hardlink-to-file symlink-to-file
.. b dir .hidden symlink-to-subdir
sh:~/ls$ ls -A
a b c dir hardlink-to-file .hidden symlink-to-file symlink-to-subdir
openbsd-6.3$ su root
openbsd-6.3# ls
.hidden a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
-f
:neřadit
Pomocí -f
možnost, ls
zobrazí položky v pořadí, v jakém se objevují v adresáři. Toto pořadí závisí na základním souborovém systému a soubory pořadí byly vytvořeny, takže je stěží předvídatelné. -f
volba také zahrnuje -a
možnost:
sh:~/ls$ ls -f
.. .hidden b dir a
c hardlink-to-file symlink-to-subdir symlink-to-file .
openbsd-6$ ls -f
. a c symlink-to-subdir
.. b hardlink-to-file
.hidden dir symlink-to-file
Je zábavné, s GNU Coreutils 8.26 ls
implementaci, můžete použít oba -l
a -f
možnosti, pokud to napíšete -fl
–ale ne pokud napíšete -lf
. Na OpenBSD oba fungují podle očekávání:
sh:~/ls$ ls -lf
.. .hidden b dir a
c hardlink-to-file symlink-to-subdir symlink-to-file .
sh:~/ls$ ls -fl
total 3100
drwxr-xr-x 3 sylvain sylvain 4096 Sep 19 12:09 ..
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
-rw-r--r-- 1 sylvain sylvain 19 Sep 20 00:09 .hidden
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
lrwxrwxrwx 1 sylvain sylvain 10 Sep 20 00:09 symlink-to-subdir -> dir/subdir
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 20 00:09 symlink-to-file -> dir/f
-rw-r--r-- 1 sylvain sylvain 2097153 Sep 20 00:45 a
drwxr-xr-x 3 sylvain sylvain 4096 Sep 20 00:09 .
openbsd-6$ ls -lf
total 6256
drwxr-xr-x 3 sylvain sylvain 512 Sep 19 23:49 .
drwxr-xr-x 5 sylvain sylvain 512 Sep 19 23:49 ..
-rw-r--r-- 1 sylvain sylvain 19 Sep 19 23:49 .hidden
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
openbsd-6$ ls -fl
total 6256
drwxr-xr-x 3 sylvain sylvain 512 Sep 19 23:49 .
drwxr-xr-x 5 sylvain sylvain 512 Sep 19 23:49 ..
-rw-r--r-- 1 sylvain sylvain 19 Sep 19 23:49 .hidden
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
-q
:Zobrazit netisknutelné znaky názvu souboru jako ?
Na souborových systémech unixového stylu může název souboru obsahovat jakýkoli znak kromě \
a znaky NUL. To znamená, že název souboru může obsahovat netisknutelné znaky nebo dokonce řídicí sekvence, které mohou rušit váš terminál. Zkusíme něco zábavného:
touch "$(echo -e '\x1B[7mBOO\x1B[0m')"
Je zřejmé, že tento soubor obsahuje netisknutelné znaky. Na moderních implementacích ls
, -q
Tato možnost se předpokládá, když je výstupem terminál, aby se zabránilo potenciálním škodlivým účinkům. Takže netisknutelné znaky budou nahrazeny otazníkem:
sh:~/ls$ ls *BOO*
?[7mBOO?[0m
Věci však budou jiné, pokud místo toho napíšete toto:
# I let you try that by yourself
# to not spoil the fun;)
sh:~/ls$ ls *BOO* | cat
Kód | cat
je k ničemu, ale jako vedlejší efekt je ls
příkaz nyní vidí na svém standardním výstupu roura namísto tty („terminál“). Protože výstup již není terminál, -q
volba již není implikována a ls
zobrazí název souboru doslovně. V takovém případě, pokud vše funguje podle očekávání, prezentovat název souboru s funky video efektem.
Explicitně pomocí -q
možnost by to vyřešila. Nechám vás, abyste si to vyzkoušeli sami (a případně si pohráli s dalšími únikovými sekvencemi ANSI). Ale při té příležitosti vás varuji před používáním ls
příkaz ve skriptech shellu. V praxi ls
je určen pro „lidskou spotřebu“. Existuje mnoho vedlejších případů týkajících se speciálně vytvořených názvů souborů, se kterými je velmi obtížné správně zacházet. Pokud potřebujete projít seznam souborů, důrazně vám doporučuji použít místo toho příkaz find. V nejjednodušších případech jednoduchý for
smyčka je dokonce dostačující – ale to by byl jiný příběh.
for f in *; do echo "$f"; done
Konec?
Tím naše prohlídka ls
končí možnosti příkazů. Není třeba zmiňovat, že to zdaleka nebylo vyčerpávající a snažil jsem se zde zaměřit na nejužitečnější a nejpřenosnější možnosti. Ale každý ls
implementace má svůj podíl skvělých funkcí, takže pokud víte o nějaké pěkné možnosti, kterou jsem v tomto článku postrádal, neváhejte se s námi o ni podělit pomocí sekce komentářů. Pokud budeme mít dostatek zpětné vazby, můžeme je dokonce sestavit a publikovat v navazujícím článku!
Když už mluvíme o příkazu ls, znáte příkaz lsof? Nesouvisí s ls, ale říká vám, který uživatel přistupuje k určitému souboru.