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ć!