Jak wprowadzić plik lub katalog ze znakami specjalnymi w nazwie?

44

Chcę wprowadzić następujący folder do terminala:

Milano, Torino (Jan)-Compressed

Jak napisać polecenie, cdaby wejść do tego katalogu?

Przestrzenie i kilka innych znaków specjalnych, takich jak \, *, ), (i ?powodować problemy, gdy próbuję je użyć w wierszu poleceń lub skryptów, na przykład:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

Jak wprowadzić nazwy plików lub katalogów zawierające ogólnie znaki specjalne w terminalu?

Pomario
źródło
Powiązane: sekcja 3.1.2. Cytowanie tego podręcznika Bash .
Eliah Kagan

Odpowiedzi:

43

To polecenie jest dwuznaczne, ponieważ spacje są zwykle używane do oddzielania argumentów. cd nie wie, co chcesz zrobić, ale masz dwie możliwości jego rozwiązania:

Albo „ maskujesz ” spacje (i wszystkie inne znaki specjalne), aby terminal wiedział, że masz na myśli spację jako znak, a nie jako separator:

cd Milano\,\ Torino\ \(Jan\)-Compressed

Lub umieść nazwę folderu lub ścieżkę w cudzysłowie :

cd "Milano, Torino (Jan)-Compressed"
krystoph
źródło
26

Mała wskazówka: uzupełnianie tabulatorów ;-)

  1. Wystarczy wpisać pierwszą literę np. cd Mi(Lub więcej liter, jeśli to konieczne) i nacisnąć Tab. Terminal pomoże ci, wypełniając pozostałe słowa.

Inny sposób: przeciągnij i upuść

  1. Jeśli widzisz katalog i chcesz uzyskać do niego dostęp za pomocą terminala, po prostu wpisz: cdnajpierw, a następnie przeciągnij i upuść katalog na terminalu i naciśnij enter.
Achu
źródło
24

Napisz to jako:

cd 'Milano, Torino (Jan)-Compressed'

W przeciwnym razie traktuje Milano,jako nazwę folderu. Dzieje się tak z powodu spacji w nazwie folderu. Możesz też uciec przed kilkoma znakami specjalnymi:

cd Milano\,\ Torino\ \(Jan\)-Compressed/
Prateek
źródło
22

tl; dr : Aby zacytować znak specjalny, użyj znaku ukośnika odwrotnego \lub umieść go w " "cudzysłowie lub w cudzysłowie ' '. Tab ↹Wypełnienie dba o prawidłowe wycenę.


To, o co prosisz, nazywa się cytowaniem :

Cytowanie służy do usuwania specjalnego znaczenia niektórych znaków lub słów z powłoki. (…) Istnieją trzy mechanizmy cytowania: znak zmiany znaczenia , pojedyncze cudzysłowy i podwójne cudzysłowy . [cytaty zaczerpnięte z man bash]

Cytując postać ucieczki \

Niecytowany ukośnik odwrotny ( \) to znak zmiany znaczenia. Zachowuje dosłowną wartość następnego następnego znaku, z wyjątkiem <newline>.

Aby wprowadzić katalog lub plik ze znakiem specjalnym, użyj tego znaku \, np .:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bash„s Programowalne Zakończenie (aka Tab ↹realizacji) automatycznie ucieka znaki specjalne z charakterem ewakuacyjnej \.

Cytowanie z podwójnymi cudzysłowami " "

Załączając znaków w cudzysłowy chroni dosłowne wartości wszystkich znaków w cudzysłowie, z wyjątkiem $, `, \i, gdy ekspansja historia jest włączona !.

Aby wprowadzić katalog lub plik ze znakiem specjalnym, należy uciec co najmniej ten drugi lub większą część nazwy pliku lub ścieżki podwójnymi cudzysłowami, np .:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

Jako $, `i !zachować swoje szczególne znaczenie wewnątrz podwójnych cudzysłowów, dopełniania parametrów , komend Zastępstwa , wyrażeń arytmetycznych i Historia rozszerzeń wykonywane są na podwójnych cudzysłowów.

Cytowanie z pojedynczymi cytatami ' '

Umieszczanie znaków w pojedynczych cudzysłowach zachowuje dosłowną wartość każdego znaku w cudzysłowach. Pojedynczy cytat może nie wystąpić między pojedynczymi cudzysłowami, nawet jeśli poprzedzony jest odwrotnym ukośnikiem.

Aby wprowadzić katalog lub plik ze znakiem specjalnym, należy uciec co najmniej ten drugi lub większą część nazwy pliku lub ścieżki podwójnymi cudzysłowami, np .:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

Więcej informacji na temat cytowania można znaleźć w man bash/ QUOTING , na wiki.bash-hackers.org i na tldp.org .

deser
źródło
10

Ciągi w kształcie litery C i ciąg „$ string”

Między innymi można użyć $'...'typu cytowania, aby użyć znaków ukośnika odwrotnego ANSI-C, takich jak \ni \t, włączając te, o których wspomniałeś. Z podręcznika bash 4.3:

Słowa w postaci $ „string” są traktowane specjalnie. Słowo rozwija się do łańcucha znaków, a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.

Jest to szczególnie przydatne w przypadku plików zawierających nowe wiersze, tabulatory, gdy piszesz złożone wiersze awk, w których musisz skorzystać z różnych sposobów rozróżniania pojedynczych i podwójnych cudzysłowów, gdy same nazwy plików zawierają miszmasz pojedynczego / podwójnego cudzysłowu itp.

Na przykład tworzenie i wyświetlanie takich plików:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

Możesz użyć wartości szesnastkowych znaków, takich jak:

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

Taki sam pomysł jak poprzednio - wykorzystaj znaki ucieczki:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

Użyj i-węzłów:

Każdy plik lub katalog ma specjalną strukturę danych zwaną i-węzłem, do której odnosi się określona liczba dziesiętna. Możesz więc użyć tego do pośredniego zlokalizowania pliku z konkretnym i-węzłem za pomocą findpolecenia i zrób coś z nim:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

Unikaj zajmowania się pojedynczymi plikami, gdy możesz używać glob

Kiedy nie musisz zajmować się pojedynczymi plikami, po prostu skorzystaj ze *znaku glob w powłoce i cytuj zmienne, przekazując je innym poleceniom. To znacznie ułatwia radzenie sobie z trudnymi nazwami plików:

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

Zwróć uwagę na użycie ./- zabezpieczenia przed nazwami plików, które mogą zawierać wiodące -w nich nazwy .

Sergiy Kolodyazhnyy
źródło
6

Aby otworzyć folder zawierający spację otaczają go w cudzysłowie, jak cd "Some Directory"i ucieczkę z miejsca backslashem, jak: cd /home/kudic/Radna\ površina.

Corey Whitaker
źródło
3
Lub uciekaj w przestrzeń za pomocą odwrotnego ukośnika, na przykład:cd /home/kudic/Radna\ površina
Timo,
Świetny punkt! Zapomniałem o tym wspomnieć. Zwykle używam cudzysłowów z przyzwyczajenia, ale w dłuższej perspektywie lepiej jest używać odwrotnego ukośnika.
Corey Whitaker,
1
Lub użyj pojedynczych cudzysłowów ( 'Radna površina'), jeśli nie chcesz, aby zmienne środowiskowe ( $VARNAME) były rozwijane i by polecenia były umieszczane w backticksach lub $()by były uruchamiane (lub jeśli w nazwie pliku występują podwójne cudzysłowy).
Eliah Kagan
3

Jeśli ten katalog znajduje się w folderze domowym, wpisz:

cd "Milano, Torino (Jan)-Compressed"

inaczej podaj ścieżkę bezwzględną:

cd "/…/…/Milano, Torino (Jan)-Compressed"

jeśli w nazwie pliku występuje podwójny cudzysłów, użyj tego znaku \"

Harshveer Singh
źródło
Jeśli zaczynasz ścieżkę od wiodącego ukośnika, przechodzi ona od katalogu głównego. Możesz to usunąć.
isaaclw
@isaaclw Dlatego złożył go jako ścieżkę bezwzględną: P
1
Ach, to trzy kropki, wskazujące folder „zmienny”. Zakładałem, że to dwie kropki, co oznacza „folder nadrzędny”. Przeprosiny.
isaaclw
3

Inną opcją, choć nie najlepszą w tym przypadku, jest użycie symboli wieloznacznych. Możesz spróbować:

cd *Torino*

Najlepiej jest użyć tej metody, gdy w nazwie katalogu znajduje się odrębne słowo lub fraza, które nie są udostępniane innym osobom. Na przykład mam punkty montowania / media / DataSSD i / media / DataHDD. Autouzupełnianie nie działa, dopóki nie wpisuję prawie połowy nazwy, więc aby przejść do partycji HDD, po prostu wpisuję

cd /media/*HD*

użytkownik242845
źródło