Jak radzić sobie ze spacjami w nazwach plików w systemie Linux

Jak radzić sobie ze spacjami w nazwach plików w systemie Linux

Kluczowe dania na wynos

Jeśli w systemie Linux masz nazwę pliku zawierającą spacje, owinięcie nazwy pliku w cudzysłów pozwoli Bashowi poprawnie ją potraktować. Uzupełnianie tabulatorów ułatwia wprowadzanie nazw plików w wierszu poleceń, nawet jeśli zawierają one spacje.

Podobnie jak większość systemów operacyjnych, Linux obsługuje nazwy plików zawierające spacje. Jednak używanie tych nazw plików w wierszu poleceń nie zawsze jest proste. Oto kilka sposobów postępowania z nazwami plików zawierającymi spacje.

Jak działają nazwy plików w systemie Linux?

Wszystko przechowywane na dysku twardym komputera musi mieć nazwę. Bez nazwy nie byłoby plików. Wszystkie aplikacje i demony uruchamiane podczas uruchamiania komputera oraz całe oprogramowanie, którego używasz, muszą zostać zidentyfikowane i zapisane w systemie plików. Identyfikatorem tym jest nazwa akt.

To samo dotyczy plików, które tworzysz lub instalujesz. Wszystkie Twoje dokumenty, obrazy i muzyka wymagają nazw plików. Bez nazw plików żaden z Twoich zasobów cyfrowych nie mógłby istnieć. Ponieważ nazwy plików są tak ważne, Linux stara się narzucić jak najmniej zasad dotyczących ich składu.

W systemie Linux nazwa pliku może zawierać dowolny znak oprócz ukośnika „/” i znaku null, 0x00. Znak null jest używany do oznaczenia końca łańcucha, więc nie może występować w samym ciągu, w przeciwnym razie Linux obciąłby nazwę pliku w miejscu znaku null. Ukośnik „/” jest używany jako separator w ścieżkach katalogów.

W nazwach plików rozróżniana jest wielkość liter i mogą one mieć długość do 255 bajtów , łącznie ze znakiem null. Ścieżki katalogów mogą mieć długość do 4096 bajtów, łącznie ze znakiem null. Należy pamiętać, że jest to ich długość w bajtach, która może nie odpowiadać bezpośrednio znakom. Na przykład 16-bitowe znaki Unicode zajmują po dwa bajty każdy.

Entuzjaści komputerów retro i osoby z długą pamięcią wiedzą, że w początkach komputerów osobistych system operacyjny Microsoftu dla dysków DOS nie rozróżniał wielkości liter i miał limit nazw plików składający się z ośmiu znaków plus trzyznakowe rozszerzenie .

Nadawanie nazw plikom wymagało dużej przemyślaności i czasami kreatywności. Dla porównania, swoboda, jaką mamy dzisiaj, oznacza, że ​​możemy nazywać pliki, jak chcemy, nie myśląc o niczym innym niż opis, który tworzymy dla tego pliku.

Jednak w przypadku nazw plików najczęściej niepokoją nas nie wpisywane przez nas znaki, ale odstępy między nimi.

Dlaczego spacje w nazwach plików systemu Linux są uciążliwe

Powłoki takie jak Bash zinterpretują oddzielony spacjami ciąg słów jako indywidualne argumenty polecenia, a nie pojedynczy argument. Oto przykład użycia touchdo utworzenia nowego pliku o nazwie „mój nowy plik.txt”.

touch my new file.txt ls

Próbuję użyć dotyku, aby utworzyć plik ze spacjami w nazwie

Jak widzimy, lspokazuje nam, że utworzone są trzy pliki, jeden o nazwie „mój”, drugi o nazwie „nowy” i jeszcze jeden o nazwie „plik.txt”.

Zauważ, że touchnie narzekałem ani nie zgłaszałem błędu. Wykonuje to, o co według niego go prosimy. Więc po cichu zwraca nas do wiersza poleceń. Jeśli nie będziemy zmotywowani do sprawdzania, nie będziemy wiedzieć, że wszystko poszło zgodnie z planem.

Aby utworzyć plik, który chcieliśmy, musimy zacytować lub uciec.

Jak cytować i uciekać ze spacji

Jeśli zacytujemy całą nazwę pliku, touchwie, że musi potraktować cytowany tekst jako pojedynczy argument.

touch 'my new file.txt' ls

Za pomocą dotyku utwórz plik ze spacjami w nazwie i całą nazwę pliku ujętą w cudzysłów

Tym razem otrzymujemy pojedynczy plik, jakiego oczekujemy.

Ten sam wynik możemy uzyskać, jeśli użyjemy znaku ukośnika odwrotnego „ \”, aby uciec od spacji. „Uciekając” od spacji, nie są one traktowane jako znaki specjalne — czyli separatory argumentów — są uważane za zwykłe, stare spacje.

touch my\ second\ new\ file.txt ls

Za pomocą dotyku utwórz plik ze spacjami w nazwie, zakończonymi ukośnikami odwrotnymi

To działa, ale uciekanie spacji powoduje, że wpisywanie nazw plików jest wolniejsze i podatne na błędy. Sprawy mogą stać się naprawdę brzydkie, jeśli masz nazwy katalogów ze spacjami.

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak ls

Używanie spacji ze znakami ucieczki w poleceniu do kopiowania pliku z jednego katalogu do drugiego

To polecenie kopiuje pojedynczy plik tekstowy z katalogu o nazwie „dir one” do katalogu o nazwie „dir two” i zapisuje kopię jako plik BAK. I to dość prosty przykład.

Jak rozwiązać problem kosmiczny u jego źródła

Jeśli są to Twoje własne pliki, możesz podjąć decyzję, aby nigdy nie używać spacji i tworzyć (lub zbiorczo zmieniać nazwy ) nazw plików w ten sposób.

mynewtextfile.txt

Trzeba przyznać, że to solidne rozwiązanie, ale i tak brzydkie. Istnieją lepsze opcje, takie jak użycie myślników „ -” lub podkreśleń „ _” do oddzielenia słów.

my-new-text-file.txt my_new_text_file.txt

Obydwa pozwolą uniknąć problemu i są czytelne. Jeśli nie chcesz dodawać dodatkowych znaków do nazw plików, możesz użyć CamelCase , aby nazwy plików były czytelne, na przykład:

MyNewTextFile.txt

Rozszerzanie zakładek ułatwia obsługę spacji

Oczywiście przyjęcie konwencji nazewnictwa i trzymanie się jej pomoże tylko wtedy, gdy masz do czynienia z własnymi plikami. Pliki pochodzące z dowolnego miejsca najprawdopodobniej nie będą zgodne z przyjętą konwencją nazewnictwa.

Możesz użyć rozwijania zakładek, aby pomóc Ci dokładnie „wypełnić” dla nas nazwy plików. Powiedzmy, że chcemy usunąć plik BAK, który utworzyliśmy w „katalogu drugim”, używając rm.

Zaczynamy od wpisania „rm dir”, ponieważ używamy tego rmpolecenia i wiemy, że nazwa katalogu zaczyna się od „dir”.

rm dir

Wpisanie początku polecenia przed naciśnięciem klawisza Tab w celu uzupełnienia tabulatora

Naciśnięcie klawisza „Tab” powoduje, że Bash szuka dopasowań w bieżącym katalogu.

Naciśnięcie klawisza Tab dodało ukośnik odwrotny i spację do częściowej ścieżki katalogu

Istnieją dwa katalogi rozpoczynające się od „dir” i w obu przypadkach następnym znakiem jest spacja. Zatem Bash dodaje ukośnik odwrotny „ \” i spację. Bash następnie czeka, aż podamy następny znak. Potrzebuje następnego znaku, aby rozróżnić dwa możliwe dopasowania w tym katalogu.

Wpiszmy „t” zamiast „dwa”, a następnie ponownie wciśnij „Tab”.

Ścieżka katalogu po wpisaniu

Bash uzupełnia za nas nazwę katalogu i czeka, aż wpiszemy początek nazwy pliku.

Mamy tylko jeden plik w tym katalogu, więc wpisanie pierwszej litery nazwy pliku, „m”, wystarczy, aby Bash wiedział, którego pliku chcemy użyć. Wpisanie „m” i naciśnięcie „Tab” uzupełnia za nas nazwę pliku, a „Enter” wykonuje całe polecenie.

Cała nazwa pliku uzupełniana poprzez naciśnięcie

Rozszerzanie zakładek ułatwia upewnienie się, że nazwy plików są prawidłowe, a także ogólnie przyspiesza nawigację i pisanie w wierszu poleceń.

Jak używać nazw plików ze spacjami w skryptach Bash

Nie jest niespodzianką, że skrypty mają dokładnie takie same problemy ze spacjami w nazwach plików, jak ma to miejsce w wierszu poleceń. Jeśli przekazujesz nazwę pliku jako zmienną, upewnij się, że podałeś nazwę zmiennej.

Ten mały skrypt sprawdza, czy w bieżącym katalogu znajdują się pliki pasujące do wzorca pliku „*.txt” i zapisuje je w zmiennej o nazwie file_list. Pętla for służy do wykonania prostej akcji na każdym z nich.

#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone

Skopiuj ten tekst do edytora i zapisz go w pliku o nazwie „files.sh”. Następnie użyj polecenia chmod , aby uczynić go wykonywalnym.

chmod +x files.sh

Użycie polecenia chmod w celu umożliwienia wykonania skryptu

Mamy kilka plików w tym katalogu. Jeden ma prostą nazwę pliku, a dwa pozostałe używają podkreśleń „ _” lub myślników „ -” zamiast spacji. To właśnie widzimy po uruchomieniu skryptu.

./files.sh

Uruchamianie skryptu files.sh z nazwami plików niezawierającymi spacji

To wydaje się działać nieźle. Ale zmieńmy pliki w katalogu na pliki zawierające spacje w nazwach.

./files.sh

Uruchamianie skryptu files.sh z nazwami plików zawierającymi spacje

Każde słowo w każdej nazwie pliku jest obsługiwane tak, jakby stanowiło samodzielną nazwę pliku, w związku z czym skrypt kończy się niepowodzeniem. Ale wszystko, co musimy zrobić, aby skrypt obsługiwał spacje w nazwach plików, to zacytować zmienną $filewewnątrz forpętli.

#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done

Zwróć uwagę, że znak dolara „ $” znajduje się w cudzysłowie. Wprowadziliśmy tę zmianę i zapisaliśmy ją w pliku skryptu „files.sh”. Tym razem nazwy plików są obsługiwane poprawnie.

./files.sh

Zmodyfikowany skrypt files.sh poprawnie obsługuje pliki ze spacjami w nazwach

Rozstawione, ale nie łuszczące się

Unikanie spacji we własnych nazwach plików zaprowadzi Cię tylko do tego momentu. Nieuniknione jest, że napotkasz pliki z innych źródeł o nazwach zawierających spacje. Na szczęście, jeśli chcesz obsługiwać te pliki w wierszu poleceń lub w skryptach, możesz to zrobić w prosty sposób.

Polecenia Linuksa

Akta

tar · pv · cat · tac · chmod · grep · diff · sed · ar · człowiek · pushd · popd · fsck · dysk testowy · seq · fd · pandoc · cd · $PATH · awk · dołącz · jq · złóż · uniq · journalctl · ogon · stat · ls · fstab · echo · mniej · chgrp · chown · rev · wygląd · ciągi znaków · wpisz · zmień nazwę · zip · rozpakuj · montuj · umount · zainstaluj · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · łatka · konwertuj · rclone · shred · srm · scp · gzip · chattr · wytnij · znajdź · umask · wc · tr

Procesy

alias · ekran · góra · ładny · renice · postęp · strace · systemd · tmux · chsh · historia · w · partia · darmowy · który · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · limit czasu · ściana · tak · zabij · uśpienie · sudo · su · czas · groupadd · usermod · grupy · lshw · zamknięcie · ponowne uruchomienie · zatrzymanie · wyłączenie · hasło · lscpu · crontab · data · bg · fg · pidof · nohup · pmap

Sieć

netstat · ping · traceroute · ip · ss · whois · fall2ban · bmon · dig · palec · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *