Come posso inserire un file o una directory con caratteri speciali nel suo nome?


44

Voglio inserire la seguente cartella nel terminale:

Milano, Torino (Jan)-Compressed

Come devo scrivere il comando cdper accedere a questa directory?

Gli spazi e molti altri caratteri speciali come \, *, ), (e ?causare problemi quando cerco di usarle nella riga di comando o di script, ad esempio:

$ 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 ?
(  )  *  ?  \

Come posso inserire nomi di file o directory che contengono caratteri speciali nel terminale in generale?


Risposte:


44

Tale comando è ambiguo perché gli spazi vengono normalmente utilizzati per separare gli argomenti. cd non sa cosa vuoi fare ma hai due possibilità per risolverlo:

O " maschera " gli spazi (e tutti gli altri caratteri speciali) in modo che il terminale sappia che intendi lo spazio come carattere e non come separatore:

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

Oppure inserisci il nome o il percorso della cartella tra virgolette :

cd "Milano, Torino (Jan)-Compressed"

26

Un piccolo consiglio: completamento della scheda ;-)

  1. Basta digitare la prima lettera, ad esempio cd Mi(o più lettere se necessario) e premere Tab. Il terminale ti aiuterà completando le altre parole.

Un altro modo: trascina e rilascia

  1. Se riesci a vedere la directory e se vuoi accedervi usando il terminale, digita: cdprima e poi trascina e rilascia la directory sul terminale e premi enter.

24

Scrivi come:

cd 'Milano, Torino (Jan)-Compressed'

Altrimenti considera Milano,il nome della cartella. Ciò accade a causa degli spazi nel nome della cartella. In alternativa sfuggire ad alcuni dei personaggi speciali:

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

22

tl; dr : per citare un carattere speciale o evitarlo con una barra rovesciata \o racchiuderlo tra " "virgolette doppie o singole ' '. Tab ↹Il completamento si occupa della corretta quotazione.


Quello che stai chiedendo si chiama Citando :

La citazione viene utilizzata per rimuovere il significato speciale di determinati caratteri o parole dalla shell. (...) Esistono tre meccanismi di quotazione: il carattere di escape , virgolette singole e virgolette doppie . [citazioni tratte da man bash]

Citando con il carattere di fuga \

Una barra rovesciata non quotata ( \) è il carattere di escape. Conserva il valore letterale del personaggio successivo che segue, ad eccezione di <newline>.

Quindi, per inserire una directory o un file con un carattere speciale, sfuggire a quest'ultimo con \, ad esempio:

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 “?”

bashIl Completamento programmabile (noto anche come Tab ↹Completamento) sfugge automaticamente ai caratteri speciali con il carattere di escape \.

Citando con virgolette doppie " "

Racchiudere caratteri tra virgolette conserva il valore letterale di tutti i caratteri all'interno delle virgolette, ad eccezione di $, `, \e, quando l'espansione della cronologia è abilitata, !.

Quindi, per inserire una directory o un file con un carattere speciale, evita almeno quest'ultimo o una parte maggiore del tuo nome file o percorso con virgolette doppie, ad esempio:

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 “?”

Come $, `e !mantengono il loro significato speciale tra virgolette doppie, Espansione parametri , Sostituzione comandi , Espansione aritmetica ed Espansione cronologia vengono eseguite su stringhe tra virgolette doppie.

Citando con virgolette singole ' '

Racchiudere i caratteri tra virgolette singole conserva il valore letterale di ciascun carattere tra virgolette. Tra virgolette singole non può verificarsi una virgoletta, anche se preceduta da una barra rovesciata.

Quindi, per inserire una directory o un file con un carattere speciale, evita almeno quest'ultimo o una parte maggiore del tuo nome file o percorso con virgolette doppie, ad esempio:

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 “\”

Puoi trovare ulteriori informazioni su Citando in man bash/ QUOTING , su wiki.bash-hackers.org e su tldp.org .


10

Stringhe tipo C e $ 'stringa'

Tra le altre cose, è possibile utilizzare il $'...'tipo di quotazione per utilizzare i caratteri barra rovesciata ANSI-C come \ne \t, inclusi quelli che hai citato. Dal manuale di bash 4.3:

Le parole del modulo $ 'stringa' sono trattate in modo speciale. La parola si espande in stringa, con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.

Ciò è particolarmente utile con i file che contengono nuove righe, tabulazioni, quando si scrivono linee awk complesse in cui è necessario utilizzare diversi modi per distinguere tra virgolette singole e doppie, quando i nomi dei file stessi contengono mishmash virgolette singole / doppie, ecc.

Ad esempio, creando ed elencando tali file:

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

Puoi utilizzare i valori esadecimali dei caratteri, come:

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

printf

Stessa idea di prima - approfitta dei personaggi di escape:

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

Usa gli inode:

A ogni file o directory è associata una struttura dati speciale denominata inode, a cui fa riferimento un determinato numero decimale. Quindi puoi usarlo per localizzare indirettamente il file con particolare inode tramite findcomando e fare qualcosa con esso:

$ 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

Evita di gestire singoli file quando puoi usare glob

Quando non hai a che fare con singoli file, approfitta del *carattere glob nella shell e cita le variabili quando le passi ad altri comandi. Semplifica molto la gestione di nomi di file difficili:

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

Nota l'uso di ./- una protezione contro i nomi dei file che possono contenere dei primi -.


6

Per aprire una cartella contenente uno spazio circondarla tra virgolette come cd "Some Directory"o la fuga lo spazio con un backslash, come: cd /home/kudic/Radna\ površina.


3
O sfuggire allo spazio con una barra rovesciata, come:cd /home/kudic/Radna\ površina
Timo

Ottimo punto! Ho dimenticato di menzionarlo. Di solito uso le virgolette per abitudine, ma la barra rovesciata è in realtà migliore da usare a lungo termine.
Corey Whitaker,

1
Oppure usa le virgolette singole ( 'Radna površina'), se non vuoi che le variabili d'ambiente ( $VARNAME) vengano espanse e che i comandi siano racchiusi nei backtick o $()siano eseguiti (o se ci sono virgolette doppie nel nome del file).
Eliah Kagan,

3

Se questa directory si trova nella cartella principale, digitare:

cd "Milano, Torino (Jan)-Compressed"

altrimenti dare percorso assoluto:

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

se c'è una doppia virgoletta nel nome del file, scappare con \"


Se inizi un percorso con una barra in avanti, passa dalla radice. Potresti volerlo rimuovere.
isaaclw,

@isaaclw Ecco perché l'ha archiviato come un percorso assoluto: P

1
Ah, sono tre punti che indicano una cartella "variabile". Supponevo che fossero due punti, indicando "cartella principale". Scuse.
Isaaclw,

3

Un'altra opzione, sebbene in questo caso non sia la migliore, è utilizzare i caratteri jolly. Puoi provare:

cd *Torino*

È meglio usare questo metodo quando c'è una parola o frase distinta nel nome di una directory non condivisa da altri. Ad esempio ho punti di montaggio / media / DataSSD e / media / DataHDD. Il completamento automatico non funziona fino a quando non digito quasi la metà del nome, quindi per arrivare alla mia partizione HDD ho appena digitato

cd /media/*HD*

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.