Rinomina file e cartelle con caratteri speciali

3

Lottando con questo e Googling non sembra darmi una soluzione che funzioni.

Ho una cartella chiamata ...

file å?? name.txt

per esempio e per evitare problemi, voglio rinominarlo comunque sto lottando per capire come. Ho provato a usare ' ' e ho anche provato a usare \ prima di ogni carattere speciale, ad es. 'file \å\?\? name \(2008\).txt' ma ho appena ricevuto il seguente errore ...

-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory

È un uso improprio di \ o ho bisogno di un approccio alternativo?

Grazie

    
posta spcurtis81 08.11.2015 - 00:09

3 risposte

5

I caratteri non ASCII non sono il problema, la tua shell può trattare perfettamente con å . Il problema è che il tuo file non è effettivamente chiamato å?? . Se lo fosse, rm 'å??' o anche rm å?? avrebbe funzionato.

Si presuppone che sia å?? perché questo è ciò che ls mostra, e questa è una supposizione ragionevole, ma ls mostrerà varie cose come ? . Ad esempio:

$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"

$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt

Come puoi vedere sopra, le nuove righe, le schede, i ritorni a capo, le campane e le schede verticali (tra le altre) sono tutte visualizzate come ? . Solo il primo file / directory di quelli creati sopra ha effettivamente ? nel suo nome. Possiamo confermarlo con ls -b :

$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\r\r\ name.txt

Quindi, puoi eseguire ls -b per ottenere il nome file corretto e quindi usare Citazioni ANSI C per rinominarlo:

mv å$'\r'$'\r' newname

In alternativa, puoi utilizzare un glob per abbinare tutti i file / directory il cui nome inizia con file å ( nota: funziona solo se ne hai uno solo):

mv "file å*" newname

Oppure rinomina tutti i file / directory il cui nome contiene caratteri non alfanumerici (di nuovo, utile solo nei casi in cui si ha un singolo caso):

shopt -s extglob  ## turn on extended globbing
mv !(*([[:graph:]])) newname

Lo strano !(*([[:graph:]])) ha bisogno di spiegazioni. extglob abilita il globbing esteso che ci consente di utilizzare !(foo) per corrispondere a "non pippo". La classe di caratteri [[:graph:]] corrisponde a tutti i caratteri stampabili (non tabulazioni, newline, ecc.) Pertanto, la corrispondenza negata !(*([[:graph:]])) corrisponderà a tutti i nomi file / nomi con caratteri non stampabili.

Se devi occuparti di più di un caso, usa un loop. Qualcosa come:

for dir in !(*([[:graph:]])); do 
     mv "$dir" "${dir//[^[:graph:]]/_}"; 
done

Il ${dir//[^[:graph:]]/_} è il nome della directory con tutti i caratteri non stampabili sostituiti da _ . Il problema con questo approccio è che puoi avere diverse directory sorgente che avranno lo stesso nome (ad esempio foo\n e foo\t diventeranno entrambe foo_ ). Se questo è un problema, rinomina anche usando un contatore:

a=0; for dir in !(*([[:graph:]])); do 
    ((a++)); 
     mv "$dir" "${dir//[^[:graph:]]/_}$a"
done

Ciò comporterebbe:

drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt6
    
risposta data terdon 08.11.2015 - 11:52
0

Per quanto ho capito, vuoi rinominare un file o una cartella con caratteri non inglesi usando il terminale.

Per questo, puoi usare

mv x y

Dove x è il nome del file / della cartella che si desidera rinominare e y è il nuovo nome che si desidera per esso.

Se ha caratteri e / o spazi non inglesi, usa ' ' per specificare i limiti di x e y dovrebbero fare. Ecco un esempio:

mv 'öld namé öf fileş' 'néw namé öf fileş'

Per favore correggimi se ho frainteso la tua domanda.

    
risposta data SarpSTA 08.11.2015 - 00:53
0

Hai chiaramente tentato di sfuggire e di quotare, puoi anche utilizzare caratteri jolly con nomi di file fastidiosi, ad es.

$ ls *name\ 2008\ .txt    <==== make sure you only get the one file

$ mv *name\ 2008\ .txt  my_new_name.txt

Se questo non soddisfa le tue esigenze, faccelo sapere - ci sono altri approcci che usano il non-globbing.

    
risposta data uDude 08.11.2015 - 07:06

Leggi altre domande sui tag