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 touch
do utworzenia nowego pliku o nazwie „mój nowy plik.txt”.
touch my new file.txt
ls
Jak widzimy, ls
pokazuje nam, że utworzone są trzy pliki, jeden o nazwie „mój”, drugi o nazwie „nowy” i jeszcze jeden o nazwie „plik.txt”.
Zauważ, że touch
nie 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, touch
wie, że musi potraktować cytowany tekst jako pojedynczy argument.
touch 'my new file.txt'
ls
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
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
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 rm
polecenia i wiemy, że nazwa katalogu zaczyna się od „dir”.
rm dir
Naciśnięcie klawisza „Tab” powoduje, że Bash szuka dopasowań w bieżącym 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”.
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.
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
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
To wydaje się działać nieźle. Ale zmieńmy pliki w katalogu na pliki zawierające spacje w nazwach.
./files.sh
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ą $file
wewnątrz for
pę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
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