Jak manipulować nazwami plików posiadającymi spacje i znaki specjalne w systemie Linux


Nazwy plików i folderów spotykamy bardzo regularnie. W większości przypadków nazwa pliku/folderu jest związana z zawartością pliku/folderu i zaczyna się od numeru i znaków. Nazwy plików alfanumerycznych są dość powszechne i bardzo szeroko stosowane, ale tak nie jest, gdy mamy do czynienia z nazwami plików/folderów, które zawierają znaki specjalne.

Uwaga: Możemy mieć pliki dowolnego typu, ale dla uproszczenia i łatwej implementacji będziemy mieć do czynienia z plikiem tekstowym (.txt) w całym artykule.

Przykłady najpopularniejszych nazw plików to:

abc.txt
avi.txt
debian.txt
...

Przykładami numerycznych nazw plików są:

121.txt
3221.txt
674659.txt
...

Przykładami nazw plików alfanumerycznych są:

eg84235.txt
3kf43nl2.txt
2323ddw.txt
...

Przykłady nazw plików, które mają znak specjalny i nie są zbyt powszechne:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

Jedno z najbardziej oczywistych pytań brzmi - kto u licha tworzy/zajmuje się nazwami plików/folderów z hasłem (#) , średnikiem (;) , a myślnik (-) lub jakikolwiek inny znak specjalny.

Zgadzam się, że takie nazwy plików nie są powszechne, ale twoja powłoka nie powinna się zepsuć/poddać, gdy masz do czynienia z takimi nazwami plików. Mówiąc technicznie, wszystko, czy to folder, sterownik czy cokolwiek innego, jest traktowane jako plik w Linuksie.

Radzenie sobie z plikiem, który ma myślnik (-) w nazwie

Utwórz plik zaczynający się od myślnika (-) , powiedzmy -abx.txt.

$ touch -abc.txt
touch: invalid option -- 'b'
Try 'touch --help' for more information.

Powodem powyższego błędu jest to, że powłoka interpretuje wszystko po myślniku (-) jako opcję i oczywiście nie ma takiej opcji, stąd błąd.

Aby rozwiązać taki błąd, musimy powiedzieć powłoce Bash (tak, to i większość innych przykładów w artykule dotyczy BASH), aby nie interpretowała niczego po znaku specjalnym (tutaj myślnik), jako opcji.

Istnieją dwa sposoby rozwiązania tego błędu:

$ touch -- -abc.txt		[Option #1]
$ touch ./-abc.txt		[Option #2]

Możesz zweryfikować plik utworzony w ten sposób na oba powyższe sposoby, uruchamiając polecenia ls lub ls -l w celu uzyskania długiego wyświetlania.

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

Aby edytować powyższy plik, możesz zrobić:

$ nano -- -abc.txt 
or 
$ nano ./-abc.txt 

Uwaga: możesz zastąpić nano dowolnym innym wybranym edytorem, powiedz vim jako:

$ vim -- -abc.txt 
or 
$ vim ./-abc.txt 

Podobnie, aby przenieść taki plik, musisz:

$ mv -- -abc.txt -a.txt
or
$ mv -- -a.txt -abc.txt

i aby usunąć ten plik, musisz:

$ rm -- -abc.txt
or
$ rm ./-abc.txt 

Jeśli masz dużo plików w folderze, którego nazwa zawiera myślnik, i chcesz usunąć je wszystkie naraz, wykonaj następujące czynności:

$ rm ./-*

1. Ta sama zasada, co omówiona powyżej, obowiązuje dla dowolnej liczby łączników w nazwie pliku i ich występowania. Mianowicie., -A-b-c.txt, ab-c.txt, abc-.txt itp.

2. Ta sama zasada, jak omówiono powyżej, dotyczy nazwy folderu zawierającego dowolną liczbę myślników i ich występowania, z wyjątkiem faktu, że do usunięcia folderu należy użyć „rm -rf” jako:

$ rm -rf -- -abc
or
$ rm -rf ./-abc

Radzenie sobie z plikami mającymi w nazwie HASH (#)

Symbol # ma zupełnie inne znaczenie w BASH. Wszystko po # jest interpretowane jako komentarz i dlatego jest pomijane przez BASH.

utwórz plik # abc.txt.

$ touch #abc.txt
touch: missing file operand
Try 'touch --help' for more information.

Powodem powyższego błędu jest to, że Bash interpretuje komentarz # abc.txt i dlatego go ignoruje. Więc polecenie touch zostało przekazane bez żadnego pliku Operand, a zatem jest to błąd.

Aby rozwiązać taki błąd, możesz poprosić BASH, aby nie interpretował # jako komentarza.

$ touch ./#abc.txt
or
$ touch '#abc.txt'

i zweryfikuj właśnie utworzony plik jako:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

Teraz utwórz plik, którego nazwa zawiera # w dowolnym miejscu poza początkiem.

$ touch ./a#bc.txt
$ touch ./abc#.txt

or
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

Uruchom „ls -l”, aby to sprawdzić:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

Co się stanie, gdy utworzysz dwa pliki (powiedzmy a i #bc) naraz:

$ touch a.txt #bc.txt

Sprawdź właśnie utworzony plik:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:18 a.txt

Z powyższego przykładu wynika, że u200bu200btylko utworzony plik „a” i plik „#bc” zostały zignorowane. Aby pomyślnie wykonać powyższą sytuację, możemy zrobić,

$ touch a.txt ./#bc.txt
or
$ touch a.txt '#bc.txt'

i zweryfikuj to jako:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 #bc.txt

Możesz przenieść plik jako:

$ mv ./#bc.txt ./#cd.txt
or
$ mv '#bc.txt' '#cd.txt'

Skopiuj to jako:

$ cp ./#cd.txt ./#de.txt
or
$ cp '#cd.txt' '#de.txt'

Możesz go edytować, korzystając z wybranego edytora jako:

$ vi ./#cd.txt
or
$ vi '#cd.txt'
$ nano ./#cd.txt
or
$ nano '#cd.txt'

I usuń to jako:

$ rm ./#bc.txt 
or
$ rm '#bc.txt'

Aby usunąć wszystkie pliki, które mają krzyżyk (#) w nazwie pliku, możesz użyć:

 # rm ./#*

Radzenie sobie z plikami mającymi w nazwie średnik (;)

Jeśli nie jesteś tego świadomy, średnik działa jako separator poleceń w BASH i być może także w innych powłokach. Średnik umożliwia wykonanie kilku poleceń za jednym razem i działa jako separator. Czy zdarzyło Ci się mieć do czynienia z nazwą pliku zawierającą średnik? Jeśli nie tutaj, to zrobisz.

Utwórz plik zawierający średnik.

$ touch ;abc.txt
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

Powodem powyższego błędu jest to, że po uruchomieniu powyższego polecenia BASH interpretuje dotyk jako polecenie, ale nie mógł znaleźć żadnego operandu plikowego przed średnikiem i dlatego zgłasza błąd. Zgłasza również inny błąd, że nie znaleziono polecenia „abc.txt”, tylko dlatego, że po średniku BASH oczekiwał innego polecenia, a „abc.txt” nie jest poleceniem.

Aby rozwiązać taki błąd, powiedz BASH, aby nie interpretował średnika jako separatora poleceń, jako:

$ touch ./';abc.txt'
or
$ touch ';abc.txt'

Uwaga: nazwa pliku została ujęta w pojedynczy cudzysłów '' . Mówi BASHowi, że ; jest częścią nazwy pliku, a nie separatorem poleceń.

Resztę czynności (tj. Kopiowanie, przenoszenie, usuwanie) na pliku i folderze mającym w nazwie średnik można wykonać bezpośrednio, umieszczając nazwę w pojedynczym cudzysłowie.

Radzenie sobie z innymi znakami specjalnymi w nazwie pliku / folderu

Nie wymaga niczego dodatkowego, po prostu zrób to normalnie, tak prosta nazwa pliku, jak pokazano poniżej.

$ touch +12.txt 

Musisz umieścić nazwę pliku w pojedynczym cudzysłowie, tak jak zrobiliśmy to w przypadku średnika. Reszta rzeczy jest prosta.

$ touch '$12.txt'

Nie musisz robić nic inaczej, traktuj to jak normalny plik.

$ touch %12.txt

Posiadanie gwiazdki w nazwie pliku niczego nie zmienia i możesz nadal używać go jak normalnego pliku.

$ touch *12.txt

Uwaga: kiedy musisz usunąć plik, który zaczyna się od * , nigdy nie używaj poniższych poleceń do usuwania takich plików.

$ rm *
or
$ rm -rf *

Zamiast tego użyj

$ rm ./*.txt

Po prostu umieść nazwę pliku w pojedynczym cudzysłowie, a reszta będzie taka sama.

$ touch '!12.txt'

Nic więcej, traktuj nazwę pliku mającą At Sign jako plik nienaruszalny.

$ touch '@12.txt'

Nie jest wymagana dodatkowa uwaga. Użyj pliku mającego ^ w nazwie jako zwykłego pliku.

$ touch ^12.txt

Nazwa pliku powinna być ujęta w pojedyncze cudzysłowy i gotowe.

$ touch '&12.txt'

Jeśli nazwa pliku zawiera nawias, musisz ująć nazwę pliku w apostrofy.

$ touch '(12.txt)'

Nie wymaga dodatkowej opieki. Potraktuj to po prostu jako kolejny plik.

$ touch {12.txt}

Nazwa pliku zawierająca szewrony musi być ujęta w pojedyncze cudzysłowy.

$ touch '<12.txt>'

Traktuj nazwy plików z nawiasami kwadratowymi jak zwykłe pliki i nie musisz się o nie martwić.

$ touch [12.txt]

Są bardzo powszechne i nie wymagają niczego dodatkowego. Po prostu zrób to, co zrobiłbyś z normalnym plikiem.

$ touch _12.txt

Posiadanie znaku równości niczego nie zmienia, możesz go używać jako zwykłego pliku.

$ touch =12.txt

Lewy ukośnik mówi powłoce, aby ignorowała następny znak. Musisz umieścić nazwę pliku w pojedynczym cudzysłowie, tak jak zrobiliśmy to w przypadku średnika. Reszta rzeczy jest prosta.

$ touch '.txt'

Nie możesz utworzyć pliku, którego nazwa zawiera ukośnik (/) , dopóki w systemie plików nie wystąpi błąd. Nie ma sposobu, aby uciec przed cięciem do przodu.

Jeśli więc możesz utworzyć plik, taki jak „/12.txt” lub „b/c.txt”, oznacza to, że w systemie plików występuje błąd lub masz obsługę Unicode, która umożliwia utworzenie pliku z ukośnikiem. W tym przypadku ukośnik nie jest prawdziwym ukośnikiem, ale znakiem Unicode, który wygląda podobnie do ukośnika.

Ponownie, przykład, w którym nie musisz podejmować żadnych specjalnych prób. Nazwy plików ze znakiem zapytania można traktować w najbardziej ogólny sposób.

$ touch ?12.txt

Pliki zaczynające się od kropki (.) są bardzo szczególne w Linuksie i nazywane są plikami z kropkami. Są to pliki ukryte, zazwyczaj pliki konfiguracyjne lub systemowe. Musisz użyć przełącznika „-a” lub „-A” z poleceniem ls, aby wyświetlić takie pliki.

Tworzenie, edycja, zmiana nazwy i usuwanie takich plików jest proste.

$ touch .12.txt

Uwaga: W Linuksie możesz mieć tyle kropek (.) , ile potrzebujesz w nazwie pliku. W przeciwieństwie do innych systemowych kropek w nazwie pliku nie oznacza oddzielenia nazwy od rozszerzenia. Możesz utworzyć plik z wieloma kropkami jako:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

i sprawdź to jako:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 14:32 1.2.3.4.5.6.7.8.9.10.txt

Możesz mieć przecinek w nazwie pliku, ile chcesz i nie potrzebujesz niczego dodatkowego. Po prostu zrób to normalnie, jako prostą nazwę pliku.

$ touch ,12.txt
or
$ touch ,12,.txt

Możesz mieć dwukropek w nazwie pliku, ile chcesz i nie potrzebujesz niczego dodatkowego. Po prostu zrób to normalnie, jako prostą nazwę pliku.

$ touch :12.txt
or
$ touch :12:.txt

Aby mieć cudzysłowy w nazwie pliku, musimy zastosować regułę wymiany. To znaczy, jeśli potrzebujesz pojedynczego cudzysłowu w nazwie pliku, umieść nazwę pliku w podwójnych cudzysłowach, a jeśli potrzebujesz podwójnego cudzysłowu w nazwie pliku, umieść go w pojedynczym cudzysłowie.

$ touch "15'.txt"

and

$ touch '15”.txt'

Niektóre edytory w systemie Linux, takie jak emacs, tworzą kopię zapasową edytowanego pliku. Plik kopii zapasowej ma nazwę oryginalnego pliku oraz tyldę na końcu nazwy. Możesz mieć plik, którego nazwa zawiera tyldę, w dowolnym miejscu po prostu jako:

$ touch ~1a.txt
or
$touch 2b~.txt

Utwórz plik, którego nazwa ma spację między znakami/słowami, powiedz „cześć, nazywam się avishek.txt”.

Nie jest dobrym pomysłem posiadanie nazwy pliku ze spacjami, a jeśli musisz wyróżnić czytelną nazwę, użyj, podkreślenia lub myślnika. Jeśli jednak musisz stworzyć taki plik, musisz użyć odwrotnego ukośnika, który ignoruje następny znak. Aby stworzyć powyższy plik musimy to zrobić w ten sposób ..

$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

Próbowałem objąć wszystkie scenariusze, z którymi możesz się spotkać. Większość powyższych implementacji jest jawnie przeznaczona dla powłoki BASH i może nie działać w innej powłoce.

Jeśli uważasz, że coś przeoczyłem (to jest bardzo powszechne i ludzkie), możesz zamieścić swoją sugestię w komentarzach poniżej. Pozostań w kontakcie, kontynuuj komentowanie. Bądź na bieżąco i bądź w kontakcie! Polub nas i udostępnij nam i pomóż nam się rozprzestrzeniać!