Kopiowanie, przenoszenie, i usuwanie plików
Do utworzenia pustego pliku możesz użyć touch plik
.
Aby utworzyć plik z zawartością, możesz użyć fortune > plik
lub echo zawartość > plik
.
Polecenia touch
i echo
, jak również znaczenie >
zostaną omówione później.
Aby wyświetlić plik, użyj cat plik
.
Katalogi
mkdir dir
tworzy nowy katalog.
mkdir -p dir1/dir2/dir3
tworzy katalog dir1
, i katalog dir2
w dir1
, i katalog dir3
w dir1/dir2
.
Podając przełącznik -p
polecenie mkdir
nie wyświetla błędu jeśli katalog już istnieje.
Do usunięcia pustego katalogu można użyć rmdir dir
.
Zadanie 1 Stwórz następujące drzewo katalogów:
.
├── foo
│ ├── baz
│ │ └── bar
│ └── bar
└── foobaz
└── bar
Zadanie 2 Usuń katalog foo/baz
.
Przykłady
user@host ~ $ ls -Al
total 0
user@host ~ $ mkdir notes/2025/04
mkdir: cannot create directory ‘notes/2025/04’: No such file or directory
user@host ~ $ mkdir notes notes/2025 notes/2025/04
user@host ~ $ tree
.
└── notes
└── 2025
└── 04
4 directories, 0 files
user@host ~ $ mkdir -p projects/2025/04
user@host ~ $ tree
.
├── notes
│ └── 2025
│ └── 04
└── projects
└── 2025
└── 04
7 directories, 0 files
user@host ~ $ touch file
user@host ~ $ mkdir file projects/2024/03
mkdir: cannot create directory ‘file’: File exists
mkdir: cannot create directory ‘projects/2024/03’: No such file or directory
user@host ~ $ mkdir -p file projects/2024/03
mkdir: cannot create directory ‘file’: File exists
user@host ~ $ tree
.
├── file
├── notes
│ └── 2025
│ └── 04
└── projects
├── 2024
│ └── 03
└── 2025
├── 04
└── 05
10 directories, 1 file
user@host ~ $ rmdir notes/2025/04
user@host ~ $ rmdir notes
rmdir: failed to remove 'notes': Directory not empty
user@host ~ $ tree
.
├── file
├── notes
│ └── 2025
└── projects
├── 2024
│ └── 03
└── 2025
├── 04
└── 05
9 directories, 1 file
user@host ~ $ rmdir -p notes/2025
user@host ~ $ tree
.
├── file
└── projects
├── 2024
│ └── 03
└── 2025
├── 04
└── 05
7 directories, 1 file
user@host ~ $
Twarde i symboliczne dowiązania
Wiele wpisów w katalogach może wskazywać na ten sam plik. Nazywa się to twardym dowiązaniem (hard link).
Wpis w katalogu może również wskazywać na inny wpis w katalogu. Nazywa się to dowiązaniem symbolicznym (soft link / symbolic link, zwykle skracane do symlink).
Wszystkie Linuksowe systemy obsługują dowiązania twarde do zwykłych plików i symlinki do dowolnych ścieżek (np. pliku lub katalogu).
Aby utworzyć twarde łącze, można użyć ln źródło cel
.
Aby utworzyć symlink, można użyć ln -s źródło cel
.
Zadanie 3 Stwórz plik plik1
z zawartością. Stwórz twarde dowiązanie do pliku plik1
o nazwie plik2
. Zmodyfikuj plik2
. Wyświetl plik1
.
Zadanie 4 Komenda ls
może wyświetlić ilość twardych dowiązań. Sprawdź gdzie ta informacja jest wyświetlana.
Miejsce na dysku wykorzystywane przez plik wraca do puli wolnej przestrzeni gdy liczba dowiązań spadnie do 0 (wszystkie wpisy w katalogach, które wskazują na plik są usunięte) i plik nie jest już otwarty w żadnym procesie.
Zadanie 5 Utwórz w swoim katalogu domowym symlink o nazwie TMP
wskazujący na /tmp
. Zmień katalog na TMP
. Co wypisuje pwd
?
Zadanie 6 Utwórz w swoim katalogu domowym symlink o nazwie loop
wskazujący na twój katalog domowy. Wejdź do loop
. I wejdź jeszcze raz do loop
.
Zadanie 7 Utwórz symlink do nieistniejącej ścieżki. Wyświetl zawartość katalogu w którym jest ten symlink.
Polecenia readlink [-f] cel
oraz realpath [-e] cel
rozwiązują
wszystkie symlinki i wyświetlają
kanoniczną postać ścieżki.
System plików Windows NTFS też obsługuje dowiązania. Tworzenie ich jest możliwe np. poleceniem mklink.
Przykłady
user@host ~ $ ls -il *
15466639 -rw-r--r-- 1 user users 55 Apr 6 00:00 text
user@host ~ $ ln text hardlink
user@host ~ $ ln -s text symlink
user@host ~ $ ls -il *
15466639 -rw-r--r-- 2 user users 55 Apr 6 00:00 hardlink
15466649 lrwxrwxrwx 1 user users 4 Apr 6 01:00 symlink -> text
15466639 -rw-r--r-- 2 user users 55 Apr 6 00:00 text
user@host ~ $ cat text
One day a tortoise will learn how to fly.
(Small Gods)
user@host ~ $ fortune -s >> hardlink
user@host ~ $ ls -il *
15466639 -rw-r--r-- 2 user users 183 Apr 6 01:00 hardlink
15466649 lrwxrwxrwx 1 user users 4 Apr 6 01:00 symlink -> text
15466639 -rw-r--r-- 2 user users 183 Apr 6 01:00 text
user@host ~ $ cat text
One day a tortoise will learn how to fly.
(Small Gods)
"Real stupidity beats artificial intelligence every time."
-- Bursar 1 - Hex 0
(Terry Pratchett, Hogfather)
user@host ~ $ rm text
user@host ~ $ ls -il *
15466639 -rw-r--r-- 1 user users 183 Apr 6 01:00 hardlink
15466649 lrwxrwxrwx 1 user users 4 Apr 6 01:00 symlink -> text
user@host ~ $ mkdir text
user@host ~ $ ls -dil *
15466639 -rw-r--r-- 1 user users 183 Apr 6 01:00 hardlink
15466649 lrwxrwxrwx 1 user users 4 Apr 6 01:00 symlink -> text
15466650 drwxr-xr-x 2 user users 4096 Apr 6 01:00 text
user@host ~ $ ln text oh_no
ln: text: hard link not allowed for directory
user@host ~ $ ln -s whatever broken
user@host ~ $ ln -s .. text/back
user@host ~ $ ls -dil * text/*
15466651 lrwxrwxrwx 1 user users 8 Apr 6 01:00 broken -> whatever
15466639 -rw-r--r-- 1 user users 183 Apr 6 01:00 hardlink
15466649 lrwxrwxrwx 1 user users 4 Apr 6 01:00 symlink -> text
15466650 drwxr-xr-x 2 user users 4096 Apr 6 01:00 text
15466652 lrwxrwxrwx 1 user users 2 Apr 6 01:00 text/back -> ..
user@host ~ $ cd text/back
user@host ~/text/back $ cd symlink/back
user@host ~/text/back/symlink/back $ cd text/back
user@host ~/text/back/symlink/back/text/back $ pwd
/home/user/text/back/symlink/back/text/back
user@host ~/text/back/symlink/back/text/back $ readlink -f .
/home/user
user@host ~/text/back/symlink/back/text/back $ realpath .
/home/user
user@host ~/text/back/symlink/back/text/back $ date > now
user@host ~/text/back/symlink/back/text/back $ ln now hardlink text
user@host ~/text/back/symlink/back/text/back $ tree
.
├── broken -> whatever
├── hardlink
├── now
├── symlink -> text
└── text
├── back -> ..
├── hardlink
└── now
Kopiowanie i przenoszenie plików
Pliki można kopiować komendą cp
i przenosić (bądź zmieniać nazwę) komendą mv
(nazwy pochodzą odpowiednio od słów copy i move).
Podstawowa składnia to cp/mv źródło… cel
.
Można podać wiele plików źródłowych jeżeli cel jest katalogiem.
Jeśli cel jest plikiem, to zostanie bez ostrzeżenia nadpisany (o ile nie zostanie użyty przełącznik -i
bądź -n
).
Domyślnie cp
odmówi kopiowania katalogu. Przełącznik -r
pozwoli skopiować rekurencyjnie katalog z zawartością.
cp
kopiując plik tworzy nowy plik z aktualną datą, domyślnymi uprawnieniami itp.
Aby skopiować rekursywnie, zachować daty, uprawnienia i inne, można użyć przełącznika -a
(--archive
).
Z przełącznikiem -l
program cp
tworzy twarde dowiązania zamiast kopiować pliki. Można to połączyć z --recursive
.
Zadanie 8 Skopuj jednym poleceniem pliki /etc/os-release
i /etc/SUSE-brand
do bieżącego katalogu.
Zadanie 9 Wykonaj mkdir someDir && for F in plik{1..3}; do echo $RANDOM$RANDOM > someDir/$F; done
które stworzy katalog someDir
z trzema plikami w środku.
Zadanie 10 Skopiuj rekurencyjnie someDir
i zawartość.
Zadanie 11 Przenieś katalog utworzony w poprzednim zadaniu do środka katalogu someDir
.
Zadanie 12 Zmień nazwę katalogu someDir
na inną.
Zadanie 13 Skopiuj nowo nazwany katalog podając przełączniki -al
. Zmień wybrany plik w którymkolwiek z katalogów. Treść których plików uległa zmianie?
(Wyświetl je cat nazwa_pliku
lub wyświetl daty modyfikacji z sekundami przez ls -l --time-style=+%H:%M:%S …
lub tree -D --timefmt=%H:%M:%S …
)
Przykłady
user@host ~ $ tree --noreport
.
├── date
├── dir
│ ├── file
│ └── now
└── text
user@host ~ $ cp text normalcopy
user@host ~ $ cp -a text archivecopy
user@host ~ $ ls -l text *copy
-rw-rw---- 1 user wheel 55 Apr 6 01:00 archivecopy
-rw-r----- 1 user users 55 Apr 6 02:00 normalcopy
-rw-rw---- 1 user wheel 55 Apr 6 01:00 text
user@host ~ $ cp -a date text copy
cp: target 'copy': No such file or directory
user@host ~ $ mkdir copy
user@host ~ $ cp -a date text copy
user@host ~ $ cp copy recursive
cp: -r not specified; omitting directory 'copy'
user@host ~ $ cp -r copy recursive
user@host ~ $ tree -Dgp --noreport recursive
[drwxr-xr-x users Apr 6 02:00] recursive
├── [-rw-r--r-- users Apr 6 02:00] date
└── [-rw-r----- users Apr 6 02:00] text
user@host ~ $ cp -a copy archive
user@host ~ $ tree -Dgp --noreport archive
[drwxr-xr-x users Apr 6 02:00] archive
├── [-rw-r--r-- users Apr 6 01:00] date
└── [-rw-rw---- wheel Apr 6 01:00] text
user@host ~ $ cp archive/date archive/text
user@host ~ $ cp -i archive/date archive/text
cp: overwrite 'archive/text'? yes
user@host ~ $ ls
archive archivecopy copy date dir normalcopy recursive text
user@host ~ $ mv normalcopy text
user@host ~ $ ls
archive archivecopy copy date dir recursive text
user@host ~ $ mv -i archivecopy text
mv: overwrite 'text'? yes
user@host ~ $ mv text archivecopy
user@host ~ $ mv archivecopy date dir
user@host ~ $ tree -Dgp --noreport
[drwxr-xr-x users Apr 6 02:00] .
├── [drwxr-xr-x users Apr 6 02:00] archive
│ ├── [-rw-r--r-- users Apr 6 01:00] date
│ └── [-rw-rw---- wheel Apr 6 02:00] text
├── [drwxr-xr-x users Apr 6 02:00] copy
│ ├── [-rw-r--r-- users Apr 6 01:00] date
│ └── [-rw-rw---- wheel Apr 6 01:00] text
├── [drwxr-xr-x users Apr 6 02:00] dir
│ ├── [-rw-rw---- wheel Apr 6 01:00] archivecopy
│ ├── [-rw-r--r-- users Apr 6 01:00] date
│ ├── [-rw-rw---- wheel Apr 6 01:00] file
│ └── [-rw-r--r-- users Apr 6 01:00] now
└── [drwxr-xr-x users Apr 6 02:00] recursive
├── [-rw-r--r-- users Apr 6 02:00] date
└── [-rw-r----- users Apr 6 02:00] text
user@host ~ $ mv dir copy
user@host ~ $ tree --noreport
.
├── archive
│ ├── date
│ └── text
├── copy
│ ├── date
│ ├── dir
│ │ ├── archivecopy
│ │ ├── date
│ │ ├── file
│ │ └── now
│ └── text
└── recursive
├── date
└── text
user@host ~ $
Kopiowanie plików do/z maszyny zdalnej
Za pomocą SSH można kopiować pliki. Jeśli ktoś ma dostęp do SSH na zdalnej maszynie, to może kopiować pliki komendą scp
.
scp
rozumie nazwa
jako ścieżkę do lokalnego pliku i użytkownik@host:nazwa
jako ścieżkę do pliku na zdalnej maszynie. Zdalne względne ścieżki są rozwiązywane względem katalogu domowego.
scp
przyjmuje przełącznik -r
do rekursywnego kopiowania katalogów.
MS Windows ma domyślnie komendę scp
, ale zwykle wygodniej jest korzystać z menadżerów plików wspierających SSH.
Większość serwerów SSH wspiera też protokół SFTP, pozwalający na wygodniejsze kopiowanie plików.
sftp użytkownik@host
uruchamia linię poleceń sftp
. Działają w niej ls
i cd
do nawigowania po zdalnych plikach oraz get
i put
do przenoszenia plików. help
pokaże wszystkie wspierane komendy.
Zadanie 14 Stwórz plik w katalogu /tmp
swojego komputera. Skopiuj go do katalogu domowego użytkownika student
na innym komputerze.
Zadanie 15 Skopiuj ten plik do katalogu /tmp
innego komputera używając scp
.
Zadanie 16 Skopiuj ten plik do katalogu /tmp
innego komputera używając sftp
.
Przykłady
user@host ~ $ whoami
user
user@host ~ $ ls
date dir text
user@host ~ $ scp example.com:myScript.pl scriptFromExample.pl
user@example.com's password:
myScript.pl 100% 85 80.2KB/s 00:00
user@host ~ $ ls
date dir scriptFromExample.pl text
user@host ~ $ scp user@example.com:myScript.pl .
user@example.com's password:
myScript.pl 100% 85 84.4KB/s 00:00
user@host ~ $ scp john@example.com:todo.txt .
john@example.com's password:
todo.txt 100% 50 49.3KB/s 00:00
user@host ~ $ ls
date dir myScript.pl scriptFromExample.pl text todo.txt
user@host ~ $ scp todo.txt user@mylaptop:/tmp/johns_todo.txt
user@mylaptop's password:
todo.txt 100% 50 75.5KB/s 00:00
user@host ~ $ scp text user@example.com:
user@example.com's password:
text 100% 30 49.2KB/s 00:00
user@host ~ $ scp dir example.com:
user@example.com's password:
scp: local "dir" is not a regular file
scp: failed to upload file dir to .
user@host ~ $ scp -r dir example.com:
user@example.com's password:
file 100% 55 94.1KB/s 00:00
now 100% 30 115.4KB/s 00:00
user@host ~ $ scp john@example.com:photos/cat.jpg \
> john@example.com:photos/ghoti.jpg \
> user@mylaptop:/tmp/johns_todo.txt \
> user@example.com:
user@example.com's password:
john@example.com's password:
cat.jpg 100% 100KB 26.8MB/s 00:00
john@example.com's password:
ghoti.jpg 100% 236KB 31.8MB/s 00:00
user@mylaptop's password:
johns_todo.txt 100% 50 47.2KB/s 00:00
user@host ~ $ sftp john@example.com
john@example.com's password:
Connected to example.com.
sftp> pwd
Remote working directory: /home/john
sftp> ls
documents photos todo.txt
sftp> lpwd
Local working directory: /home/user
sftp> lls
date dir myScript.pl scriptFromExample.pl text todo.txt
sftp> put myScript.pl userScript.pl
Uploading myScript.pl to /home/john/userScript.pl
myScript.pl 100% 85 137.0KB/s 00:00
sftp> put dir/file
Uploading dir/file to /home/john/file
file 100% 55 89.4KB/s 00:00
sftp> lcd dir
sftp> lpwd
Local working directory: /home/user/dir
sftp> get todo.txt new_todo.txt
Fetching /home/john/todo.txt to new_todo.txt
todo.txt 100% 50 77.3KB/s 00:00
sftp> get photos
Fetching /home/john/photos/ to photos
download /home/john/photos/: not a regular file
sftp> get -r photos
Fetching /home/john/photos/ to photos
Retrieving /home/john/photos
ghoti.jpg 100% 236KB 45.1MB/s 00:00
cat.jpg 100% 100KB 43.4MB/s 00:00
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
sftp> ls
sftp> put -r dir/*
Uploading dir/file to /tmp/file
file 100% 55 72.3KB/s 00:00
Uploading dir/new_todo.txt to /tmp/new_todo.txt
new_todo.txt 100% 50 219.8KB/s 00:00
Uploading dir/now to /tmp/now
now 100% 30 160.8KB/s 00:00
Uploading dir/photos/ to /tmp/photos
Entering dir/photos/
cat.jpg 100% 100KB 27.8MB/s 00:00
ghoti.jpg 100% 236KB 39.2MB/s 00:00
sftp> ls -l
-rw-r----- ? john john 55 Apr 6 02:00 file
-rw-r--r-- ? john john 50 Apr 6 02:00 new_todo.txt
-rw-r--r-- ? john john 30 Apr 6 02:00 now
drwxr-xr-x ? john john 4096 Apr 6 02:00 photos
sftp> lls -l
total 16
-rw-rw---- 1 user wheel 55 Apr 6 01:00 file
-rw-r--r-- 1 user users 50 Apr 6 02:00 new_todo.txt
-rw-r--r-- 1 user users 30 Apr 6 01:00 now
drwxr-xr-x 2 user users 4096 Apr 6 02:00 photos
sftp> quit
user@host ~ $
Rsync
Program rsync
jest powszechnie używany do kopiowania plików i katalogów. Wydajnie porównuje pliki źródłowe z docelowymi i kopiuje tylko różnice. Może kopiować dane do/z zdalnych urządzeń, a także może kompresować dane przesyłane przez sieć dla zwiększenia przepustowości. rsync
jest też powszechnie używany do tworzenia kopii zapasowych.
Usuwanie plików
Program usuwający pliki nazywa się rm
(od remove).
rm
domyślnie nie usunie katalogów (niezależnie czy są puste) ani plików chronionych przed zapisem.
Aby usunąć katalog poleceniem rm
(wraz z całą zawartością) trzeba dodać przełącznik -r
.
Aby usunąć plików zabezpieczony przed zapisem (i nie wyświetlać ostrzeżenia jeśli plik który nakazano usunąć nie istnieje) można użyć przełącznika -f
(--force
).
Przypadkowo bądź nieprawidłowo użyte rm -rf …
jest częstą przyczyną utraty danych. Szczególnie uważaj na wszystkie *
i to do czego się rozwiną.
rm
przyjmuje przełączniki -I
i -i
które proszą o potwierdzenie usunięcia plików. -I
pyta raz przed rozpoczęciem usuwania wielu plików, a -i
pyta przed usunięciem każdego pliku z osobna.
Zadanie 17 Stwórz wiele plików komendą touch file_{a..z}
.
Usuń wszystkie te pliki jednym poleceniem rm
:
bez przełączników,
z przełącznikiem -f
,
z przełącznikiem -I
,
z przełącznikiem -i
.
Zadanie 18 Powtórz komendę usuwającą pliki z poprzedniego zadania po usunięciu plików.
Potem powtórz tą komendę raz jeszcze z przełącznikiem -f
.
Zadanie 19 Stwórz katalog i usuń go używając rm
.
Przykłady
user@host ~ $ ls -lt
total 44
drwxr-xr-x 3 user users 4096 Apr 7 19:34 misc
drwxr-xr-x 2 user users 4096 Apr 6 02:00 photos
-rw-r--r-- 1 user users 30 Apr 6 02:00 normalfile.txt
-r--r--r-- 1 user wheel 30 Apr 6 02:00 readonlyfile.txt
-rw-r--r-- 1 user users 165 Apr 6 02:00 input-1.txt
-rw-r--r-- 1 user users 139 Apr 6 02:00 input-2.txt
-rw-r--r-- 1 user users 85 Apr 6 02:00 data1.csv
-rw-r--r-- 1 user users 50 Apr 6 02:00 data2.csv
-rw-r--r-- 1 user users 125 Apr 6 02:00 data3.csv
-rw-r--r-- 1 user users 100 Apr 6 02:00 data4.csv
-rw-r--r-- 1 user users 200 Apr 6 02:00 data5.csv
user@host ~ $ rm normalfile.txt
user@host ~ $ ls -t
misc readonlyfile.txt input-2.txt data2.csv data4.csv
photos input-1.txt data1.csv data3.csv data5.csv
user@host ~ $ rm readonlyfile.txt
rm: remove write-protected regular file 'readonlyfile.txt'?
user@host ~ $ ls -t
misc readonlyfile.txt input-2.txt data2.csv data4.csv
photos input-1.txt data1.csv data3.csv data5.csv
user@host ~ $ rm -f readonlyfile.txt
user@host ~ $ ls -t
misc input-1.txt data1.csv data3.csv data5.csv
photos input-2.txt data2.csv data4.csv
user@host ~ $ rm normalfile.txt
rm: cannot remove 'normalfile.txt': No such file or directory
user@host ~ $ rm -f normalfile.txt
user@host ~ $ rm photos
rm: cannot remove 'photos': Is a directory
user@host ~ $ rm -r photos
user@host ~ $ ls -t
misc input-2.txt data2.csv data4.csv
input-1.txt data1.csv data3.csv data5.csv
user@host ~ $ ls -ld misc/rootsDir misc/rootsDir/data
drwxr-xr-x 2 root root 4096 Apr 7 19:33 misc/rootsDir
-rw-r--r-- 1 user users 50 Apr 6 02:00 misc/rootsDir/data
user@host ~ $ rm misc/rootsDir/data
rm: cannot remove 'misc/rootsDir/data': Permission denied
user@host ~ $ ls misc
file now rootsDir
user@host ~ $ rm -r misc
rm: descend into write-protected directory 'misc/rootsDir'? y
rm: cannot remove 'misc/rootsDir/data': Permission denied
user@host ~ $ ls misc
rootsDir
user@host ~ $ rm input-1.txt input-2.txt
user@host ~ $ rm -i data*.csv
rm: remove regular file 'data1.csv'?
rm: remove regular file 'data2.csv'?
rm: remove regular file 'data3.csv'? ^C
user@host ~ $ ls -t
misc data1.csv data2.csv data3.csv data4.csv data5.csv
user@host ~ $ rm -I data*.csv
rm: remove 5 arguments? y
user@host ~ $ ls -t
misc