programmera.net -> linux -> normal     för utskrift      info@programmera.net

Kommandon på filer: Flytta, kopiera och ta bort

  Kommando    Exempel  Beskrivning
  cp  cp a.txt /home/olle/foo/  Kopierar filen a.txt till katalogen /home/olle/foo/.
  scp  scp a.txt root@10.0.0.4:/home/olle/foo/  Kopierar filen a.txt till maskinen 10.0.0.4 in i mappen /home/olle/foo/.
  ln  ln -s a.txt my_link  Skapar en mjuk länk till filen a.txt.
  mv  mv a.txt /home/olle/foo/  Flyttar filen a.txt till katalogen /home/olle/foo/.
  rm  rm a.txt  Raderar filen a.txt.

På denna sida beskrivs hur man kopierar, flyttar, raderar och länkar filer. Jag kommer att avsluta alla namn som syftar på en katalog med / (slash), detta för att öka läsbarheten. Tecknet / är inte en del av katalogens namn utan bara en markör som visar att det rör sig om en katalog. Vi skapar en katalog för att visa principen:
[olle@dev1]$ mkdir newdir/
[olle@dev1]$ ls
a.txt  b.txt  c.txt  newdir


cp

Flagga  Betydelse  Beskrivning
cp -f a.txt foo/  force  Kopierar a.txt till foo/ utan att fråga innan en existerande fil skrivs över (default).
cp -i a.txt foo/  interactive  Kopierar a.txt till foo/ men frågar innan en existerande fil skrivs över.
cp -p a.txt foo/  preserve  Kopierar a.txt till foo/ men bevarar modifikationstid från a.txt.
cp -P src/a.txt foo/  path  Kopierar src/a.txt till foo/, alltså både a.txt och katalogen src/.
cp -r src/ foo/  recursive  Kopierar katalogen src/ och allt innehåll till foo/.
cp -u a.txt foo/  updated  Kopierar a.txt till foo/ då a.txt är nyare än foo/a.txt (om den redan finns).
cp -v a.txt foo/  verbose  Kopierar a.txt till foo/ och skriver ut en kommentar.

Kommandot står för copy och kopierar en eller flera filer. OBS: Om man inte använder flaggan i raderas destinationsfilen om den redan existerar. Man bör alltså vara försiktig med kopieringar ty om en fil skrivs över finns det inget sätt att få tillbaka den. Med flaggan r (recursive) kan man kopeiera hela strukturer i ett svep:
[olle@dev1]$ ls
src
[olle@dev1]$ ls foo/
a.txt  b.txt  c.txt  dir1
[olle@dev1]$ cp -r foo/ foo_copy/
[olle@dev1]$ ls
foo  foo_copy
[olle@dev1]$ ls foo_copy/
a.txt  b.txt  c.txt  dir1
Som exemplet ovan visar skapas alltså katalogen foo_copy/ och fylls med samma innehåll som finns i foo/. När man kopierar inom samma katalog så skriver man det nya namnet som andra parameter:
[olle@dev1]$ cp a.txt a_copy.txt
[olle@dev1]$ ls
a.txt  a_copy.txt

scp

Flagga  Betydelse  Beskrivning
scp -r src/ root@10.0.0.4:/home/olle/foo/  recursive  Kopierar katalogen src/ och allt innehåll till maskinen 10.0.0.4 in i mappen /home/olle/foo/. Användaren loggar in som root på 10.0.0.4.
scp -v a.txt root@10.0.0.4:/home/olle/foo/  verbose  Kopierar a.txt till maskinen 10.0.0.4 in i mappen /home/olle/foo/ och skriver ut en kommentar. Användaren loggar in som root på 10.0.0.4.

Kommandot står för secure copy och kopierar en eller flera filer över nätverket. scp använder ssh (secure shell) för dataöverföringen, och användaren måste skriva in lösenord i samband med kopieringen. För att kopiering mellan datorer ska vara möjlig krävs alltså dessa saker:
  • Den avlägsna datorn har en ssh-server rullande.
  • Om datorerna inte har utbytt nycklar (som krävs för RSA-krypteringen) måste de göra detta i samband med kopieringen.
  • Användaren känner till en användare och ett lösenord på den avlägsna datorn eftersom en inloggning ofta krävs.
Med flaggan r (recursive) kan man kopeiera hela strukturer i ett svep.
ln

Flagga  Betydelse  Beskrivning
ln a.txt a_link     Skapar en hård länk till a.txt.
ls -s a.txt a_link  soft  Skapar en mjuk länk till a.txt.

Detta kommando står för link och skapar en länk. Det finns två sorters länkar; hårda och mjuka.

En hård länk är ett nytt namn på filen. Efter att man skapat en hård länk går det inte att veta vilken av de två namnen som är det "äkta" namnet på filen. För att den riktiga filen ska försvinna måste båda namnen tas bort. Båda namnen är nämligen kopplade till samma inod som unikt pekar ut filen. Nu ska jag testa att skapa en hård länk:
[olle@dev1]$ ln a.txt a_link
[olle@dev1]$ ls -l
-rw-rw-r--   2 olle    olle         9 aug  7 13:00 a_link
-rw-rw-r--   2 olle    olle         9 aug  7 13:00 a.txt
-rw-rw-r--   1 olle    olle        61 aug  7 13:06 b.txt
-rw-rw-r--   1 olle    olle        22 aug  7 13:19 c.txt
drwxrwxr-x   2 olle    olle      4096 aug  7 13:25 dir1
Här ser vi att den hårda länken a_link ser ut som vilken fil som helst, och har samma modifieringstid som a.txt (eftersom det är samma fil). Både a.txt och a_link har siffran 2 i andra kolumnen, vilket betyder att det finns 2 namn som refererar till den filen. Hur kan vi då bevisa att det är samma fil? Jo genom att jämföra inodernas nummer:
[olle@dev1]$ ls -i
500048 a_link   500049 b.txt   634619 dir1
500048 a.txt    500050 c.txt

En mjuk länk är en egen liten fil som pekar ut en annan fil. Om du tar bort den utpekade filen kommer den att försvinna och den mjuka länken ligger kvar men är bruten. Jag skapar en mjuk länk:
[olle@dev1]$ ln -s a.txt a_soft
[olle@dev1]$ ls -l
lrwxrwxrwx   1 olle    olle         5 aug  7 13:47 a_soft -> a.txt
-rw-rw-r--   1 olle    olle         9 aug  7 13:00 a.txt
-rw-rw-r--   1 olle    olle        61 aug  7 13:06 b.txt
-rw-rw-r--   1 olle    olle        22 aug  7 13:19 c.txt
drwxrwxr-x   2 olle    olle      4096 aug  7 13:25 dir1
Vi ser att det är mycket som skiljer den mjuka länken från den utpekade filen. Rättigheterna börjar med l, storleken är bara 5, modifikationstiden är satt till då länken skapades och i namnet ser man en pil som visar vilken fil som refereras. I mitt tycke är mjuka länkar att föredra framför hårda, eftersom man inte blir lika förvirrad.


mv

Flagga  Betydelse  Beskrivning
mv -b a.txt foo/  backup  Flyttar a.txt till katalogen foo och gör en backup (a.txt~) om det redan finns en a.txt i foo.
mv -f a.txt foo/  force  Flyttar a.txt till katalogen foo och skriver över a.txt om det finns en sådan fil finns i foo.
mv -i a.txt foo/  interactive  Flyttar a.txt till katalogen foo men frågar innan den skriver över någon fil.
mv -u a.txt foo/  updated  Flyttar a.txt till katalogen foo men bara om a.txt inte existerar i foo eller är äldre än den filen som flyttas.
mv -v a.txt foo/  verbose  Flyttar a.txt till katalogen foo och skriver ut en kommentar.

Kommandot står för move och flyttar mycket riktigt en fil eller katalog. OBS: Om man inte använder flaggan i (interactive) raderas destinationsfilen om den redan existerar. Förutom att man kan råka radera en existerande fil med mv, så förändras ingenting förutom sökvägen till filen/katalogen. Under ytan så flyttar inte Linux på en fil när man gör mv, endast sökvägen till filen ändras. Filen behåller sin gamla inod. Om man flyttar en fil/katalog innom en katalog byter man egentligen bara namn på filen/katalogen:
[olle@dev1]$ ls -l
-rw-rw-r--   1 olle    olle         9 aug  7 13:00 a.txt
-rw-rw-r--   1 olle    olle        61 aug  7 13:06 b.txt
-rw-rw-r--   1 olle    olle        22 aug  7 13:19 c.txt
drwxrwxr-x   2 olle    olle	 4096 aug  7 13:25 dir1
[olle@dev1]$ mv a.txt aa.txt
[olle@dev1]$ ls -l
-rw-rw-r--   1 olle    olle         9 aug  7 13:00 aa.txt
-rw-rw-r--   1 olle    olle        61 aug  7 13:06 b.txt
-rw-rw-r--   1 olle    olle        22 aug  7 13:19 c.txt
drwxrwxr-x   2 olle    olle	 4096 aug  7 13:25 dir1
Som vi ser förändras inget förutom namnet på filen a.txt.
rm

Flagga  Betydelse  Beskrivning
rm -f a.txt  force  Raderar a.txt utan att fråga.
rm -i a.txt  interactive  Frågar om man vill radera a.txt, om man svarar y raderas a.txt.
rm -r foo/  recursive  Raderar katalogen foo med allt innehåll.
rm -v a.txt  verbose  Raderar a.txt och skriver ut en kommentar om hur det gick.

Kommandot raderar en eller flerar filer. Med flaggan r (recursive) kan man radera en katalog med allt innehåll. OBS: När du raderat en fil finns det inget sätt att ångra detta. Linux har ingen papperskorg som man brukar finna i andra operativsystem. Nu ska vi testa att radera lite filer interaktivt:
[olle@dev1]$ ls /home/olle/foo/
a.txt  b.txt  c.txt  dir1
[olle@dev1]$ rm -ir /home/olle/foo/
rm: descend into directory `/home/olle/foo`? y
rm: descend into directory `/home/olle/foo/dir1`? n
rm: remove `/home/olle/foo/a.txt`? y
rm: remove `/home/olle/foo/b.txt`? y
rm: remove `/home/olle/foo/c.txt`? y
rm: remove directory `/home/olle/foo/` (might be nonempty)? n
[olle@dev1]$ ls /home/olle/foo/
dir1
I exemplet ovan valde vi att radera alla filer i foo/ men inte katalogen själv och inte heller katalogen foo/dir1/. Vill man ta bort rubbet utan att behöva svara på en massa frågor gör man såhär:
[olle@dev1]$ rm -r /home/olle/foo/
[olle@dev1]$ ls /home/olle/
jox  tester
Nu försvann katalogen foo/ med allt innehåll.