===== 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.#~~ Stwórz następujące drzewo katalogów:
.
├── foo
│ ├── baz
│ │ └── bar
│ └── bar
└── foobaz
└── bar
~~Zadanie.#~~ Usuń katalog ''foo/baz''.
++++Przykłady|{{page>so:files_basics:examples#mkdir_rmdir&inline&noheader}}++++
==== Twarde i symboliczne dowiązania ====
Wiele wpisów w katalogach może wskazywać na ten sam plik. Nazywa się to [[https://en.wikipedia.org/wiki/Hard_link|twardym dowiązaniem]] (//hard link//). \\
Wpis w katalogu może również wskazywać na inny wpis w katalogu. Nazywa się to [[https://en.wikipedia.org/wiki/Symbolic_link|dowiązaniem symbolicznym]] (//soft link// / //symbolic link//, zwykle skracane do //symlink//).
Wszystkie Linuksowe systemy [[https://en.wikipedia.org/wiki/Comparison_of_file_systems#File_capabilities|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.#~~ Stwórz plik ''plik1'' z zawartością. Stwórz twarde dowiązanie do pliku ''plik1'' o nazwie ''plik2''. Zmodyfikuj ''plik2''. Wyświetl ''plik1''.
~~Zadanie.#~~ 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.#~~ Utwórz w swoim katalogu domowym symlink o nazwie ''TMP'' wskazujący na ''/tmp''. Zmień katalog na ''TMP''. Co wypisuje ''pwd''?
~~Zadanie.#~~ 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.#~~ 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ą
[[https://en.wikipedia.org/wiki/Canonicalization|kanoniczną]] postać ścieżki.
System plików Windows NTFS też obsługuje dowiązania. Tworzenie ich jest możliwe np. poleceniem [[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/mklink|mklink]].
++++Przykłady|{{page>so:files_basics:examples#ln&inline&noheader}}++++
==== 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.#~~ Skopuj jednym poleceniem pliki ''/etc/os-release'' i ''/etc/SUSE-brand'' do bieżącego katalogu.
~~Zadanie.#~~ 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.#~~ Skopiuj rekurencyjnie ''someDir'' i zawartość.
~~Zadanie.#~~ Przenieś katalog utworzony w poprzednim zadaniu do środka katalogu ''someDir''.
~~Zadanie.#~~ Zmień nazwę katalogu ''someDir'' na inną.
~~Zadanie.#~~ 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|{{page>so:files_basics:examples#cp_mv&inline&noheader}}++++
==== 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 [[https://en.wikipedia.org/wiki/Comparison_of_FTP_client_software#Protocol_support|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.#~~ Stwórz plik w katalogu ''/tmp'' swojego komputera. Skopiuj go do katalogu domowego użytkownika ''student'' na innym komputerze.
~~Zadanie.#~~ Skopiuj ten plik do katalogu ''/tmp'' innego komputera używając ''scp''.
~~Zadanie.#~~ Skopiuj ten plik do katalogu ''/tmp'' innego komputera używając ''sftp''.
++++Przykłady|{{page>so:files_basics:examples#scp_sftp&inline&noheader}}++++
=== Rsync ===
Program ''[[https://en.wikipedia.org/wiki/Rsync|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.#~~ 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.#~~ 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.#~~ Stwórz katalog i usuń go używając ''rm''.
++++Przykłady|{{page>so:files_basics:examples#rm&inline&noheader}}++++
~~META:
language = pl
~~