it-swarm-eu.dev

Kdy bych měl použít koncové lomítko v adresáři?

Možný duplikát:
Jak linux zpracovává více oddělovačů cest (/ home //// username /// file)

Většina příkazů, které používám v Linuxu, se chová úplně stejně, ať už zahrnuji koncové lomítko / na konci názvu adresáře nebo ne.

Například:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

Kdy na tom záleží lomítko? Jaký je sémantický význam koncové lomítka?

61
Cory Klein

Dobrým příkladem je přesunutí souboru do adresáře:

mv some_file foo

vs.

mv some_file foo/

Pokud foo neexistuje, první přejmenuje some_filefoo, spíše než zamýšlený foo/some_file; druhý si stěžuje, což je to, co chcete.

Pokud foo existuje, ale není adresářem, první může clobber soubor foo; znovu si druhý stěžuje.

cp představuje podobné problémy.

Při práci na některých starých verzích SunOS jsem si vytvořil zvyk připojovat /., protože systém ve skutečnosti ignoroval koncové / na název souboru; například, /etc/motd/ by odkazoval spíše na soubor než na chybu. Zdá se, že novější verze SunOS/Solaris tento problém nemají.

48
Keith Thompson

Je to zcela na nástroji. rm vám nedovolí odebrat symbolický odkaz do adresáře, pokud je na konci lomítko, a rsync dělá různé věci, pokud má specifikace zdrojového souboru lomítko na konci.

37

foo/ je jako foo/., takže pokud foo je symbolický odkaz na adresář, foo/ je adresář (ne symbolický odkaz), a pokud foo není adresář nebo symbolický odkaz do adresáře, pak se zobrazí chyba ENOTDIR u všech pokusů o přístup k foo/. To je chování na Linuxu.

Chování se u jiných systémů může lišit.

Viz zde a zde a zde , abyste zjistili, co o tom mají POSIX/SUS.

16
Stéphane Chazelas

V rsync vypadá tato stránka manuálně:

   A trailing slash on the source changes this behavior to avoid  creating
   an  additional  directory level at the destination.  You can think of a
   trailing / on a source as meaning "copy the contents of this directory"
   as  opposed  to  "copy  the  directory  by name", but in both cases the
   attributes of the containing directory are transferred to the  contain-
   ing  directory on the destination.  In other words, each of the follow-
   ing commands copies the files in the same way, including their  setting
   of the attributes of /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo

Koncové lomítko na cíl vůbec nezáleží. Pouze na zdroji. (A pak, samozřejmě, záleží pouze na tom, zda je zdrojem spíše adresář než jeden soubor nebo glob.)

Pro ilustraci adresáře do adresáře použijte případ:

$ mkdir foo bar baz
$ chmod 700 foo
$ chmod 750 bar
$ chmod 705 baz
$ echo hello > foo/file1
$ chmod 606 foo/file1 
$ ls -n
total 0
drwxr-x---  2 501  20   68 Aug  8 15:29 bar/
drwx---r-x  2 501  20   68 Aug  8 15:29 baz/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n foo
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rsync -a foo bar
$ rsync -a foo baz/
$ rsync -a foo bif
$ rsync -a foo bonk/
$ ls -n
total 0
drwxr-x---  3 501  20  102 Aug  8 15:30 bar/
drwx---r-x  3 501  20  102 Aug  8 15:30 baz/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bif/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

baz:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bif:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bonk:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rm -rf b*
$ mkdir bar baz
$ chmod 750 bar
$ chmod 705 baz
$ rsync -a foo/ bar
$ rsync -a foo/ baz/
$ rsync -a foo/ bif
$ rsync -a foo/ bonk/
$ ls -n
total 0
drwx------  3 501  20  102 Aug  8 15:30 bar/
drwx------  3 501  20  102 Aug  8 15:30 baz/
drwx------  3 501  20  102 Aug  8 15:30 bif/
drwx------  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

baz:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bif:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bonk:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ 
6
Wildcard