Vai alla directory con nome sconosciuto


8

Durante il disimballaggio di un tarball, ho trovato una directory che lsriporta come "??????????????? ?????". Presumibilmente, il nome non è in Unicode? Comunque, non riesco a trovare un modo per accedere alla cartella. Ci ho provato cd $(find -inum inode_number), ma questo mi dà

"bash: cd: ./??????????: No such file or directory".

Esiste un altro modo per accedere direttamente a una cartella tramite il suo numero di inode?


È forse lessicicamente il primo nell'elenco delle directory? Quindi cd */potrebbe funzionare. *dovrebbe espandere una descrizione comprensibile della shell della directory e cdignorare gli argomenti extra. Un altro modo potrebbe essere quello di utilizzare un file manager grafico (incluso il MC basato su terminale) o i navigatori di file tree integrati, ad esempio Vim. Puoi anche sperimentare direttamente il -execpassaggio a find, not with cd` (che è una shell integrata) ma con es. lsE altri strumenti.
Daniel Andersson,

@Daniel: in alcune shell, cdcon più argomenti non riesce.
Scott,

@Scott: True. POSIX non specifica il comportamento di più argomenti. Bash e Dash ignorano gli argomenti extra, csh esce con " too many arguments".
Daniel Andersson,

Risposte:


3

Un approccio generale per poter operare su qualsiasi directory (o file) è utilizzare il suo numero di inode.

Innanzitutto, utilizzare ls per ottenere l'inode della cartella in questione:

ls -lia
  • -l per elenco lungo (opzionale)
  • -i per ottenere valori di inode
  • -a per visualizzare tutti i file, anche i file nascosti (opzionale)

Nell'elenco vedrai un numero lungo nella prima colonna, qualcosa del genere:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Ora puoi passare a quella directory usando:

cd "$(find -inum ######)"

... ma sostituendo ###### con il numero lungo visualizzato nell'elenco delle directory.

Naturalmente il comando non deve essere cd. Potrebbe essere rm, cp, mv, ecc ...


2

Poiché i personaggi sono probabilmente personaggi internazionali, probabilmente appaiono come codici di controllo nel tuo set di caratteri en_US, motivo per cui li sta mostrando come punti interrogativi.

Ciò può essere dovuto alla scelta della tua distribuzione di alias per impostazione predefinita nel profilo globale. Per esempio:

alias ls='ls -q'

Puoi vedere se la tua distribuzione lo ha fatto digitando nella tua shell:

alias ls

Che stamperà qualcosa di simile al seguente:

$ alias ls
alias ls='ls --color=auto'

La pagina collegata sotto suggerisce che se fai "ls -b", vedrai i codici di controllo ottali in modo da sapere almeno quali caratteri sono in uso.

http://www.arsc.edu/arsc/support/howtos/nonprintingchars/

Supponendo che non funzioni, hai un'altra opzione menzionata più vicino in fondo:

Uno strumento di cui non ero a conoscenza fino ad ora chiamato OctalDump (su Debian - / usr / bin / od)

$ ls | od -b

Ti mostrerà la forma ottale dei codici di controllo.

$ ls | od -c

Ti mostrerà i personaggi, inclusi eventuali spazi bianchi aggiuntivi nascosti che potrebbero essere alla fine (nota gli spazi extra alla fine nel loro esempio)

Una volta che sai quali sono i personaggi di controllo in gioco e se ci sono spazi bianchi nascosti aggiuntivi, potresti essere in grado di creare un modo per cd nella directory sfuggendo ai caratteri di controllo. In caso contrario, hai un paio di opzioni per rinominare la directory.

La pagina sopra ha anche, convenientemente, un metodo rapido e sporco per rimuovere i caratteri di controllo tramite il comando mv, che penso funzionerà, purché sfugga allo spazio, ma NON sfuggire ai punti interrogativi (rendendoli così singolo carattere caratteri jolly) e finché non esiste nient'altro nella directory in cui si trova questa directory canaglia. Il motivo di questi requisiti espliciti è perché si utilizzano solo caratteri jolly e il singolo spazio e quindi non si desidera che il carattere jolly corrisponda inavvertitamente a qualsiasi altro file o directory.

Se il metodo sopra non funziona, puoi quasi sicuramente usare il metodo find menzionato da altre risposte, in modo diverso. Invece di provare a cd nella directory usando il numero di inode, che è quello che hai detto di aver provato, puoi rinominarlo usando il numero di inode. Assicurati solo di copiare l'intero set di 3 righe per quell'unico comando dalla pagina sopra (sostituisci la parte "nome-desiderato" con il nome effettivo in cui vuoi rinominarlo comunque).

Dopo aver rinominato la directory, dovresti essere in grado di accedervi. Posso solo sperare che non contenga anche file con codici di controllo nei nomi, o dovrai risciacquare e ripetere per ogni file (e / o sottodirectory) nella directory che hai appena rinominato, a quel punto un ciclo for probabilmente è saggio nominare ogni file come numero, aumentando da 1. :-)


0

"?" ha un significato speciale nella shell, significa "qualsiasi carattere, incluso nessuno". Quindi se il tuo file è davvero chiamato "??????????????? ?????" probabilmente dovrai scappare dal "?" (e spazi toos) in modo da poter provare qualcosa come cd \? \? \? \? \? \? \ \? \? \? \? (se non hai già provato)

Ciò presuppone che qualcuno abbia intenzionalmente dato al file quel nome difficile, piuttosto che codifica confusa / corrotta / illegale.


1
Ma ricorda che gli lspiace mostrare caratteri non ASCII (≥0x7F) come ?–– quindi il nome della directory probabilmente non è solo una stringa di punti interrogativi.
Scott

0

Fare un ls. C'è qualcosa nella directory (file o sottodirectory) con un nome più lungo della sottodirectory mystery (che è 21, se il tuo “???????????????? ?????” è preciso)? Quindi rinominali con nomi più brevi o spostali in altre directory. Quindi digitare

cd ????????????????????*

Questo carattere jolly (20 punti interrogativi seguiti da un asterisco) dovrebbe corrispondere a qualsiasi nome che sia lungo o più di 20 caratteri –– e la prima istruzione che ho dato avrebbe dovuto garantire che la tua sottodirectory misteriosa fosse l'unica cosa che corrispondesse a quel modello. Ma potrebbe essere più utile da fare

mv ????????????????????* nuovo nome


3
Potrebbe essere utile eseguire lscon l' opzione --quoting-style=shello --quoting-style=escapeper forzarlo a produrre una versione con escape corretta di quel nome file.
Dan D.

1
@DanD. +1 per un'opzione interessante che non conoscevo. Di solito uso solo un file manager gui quando si deve affrontare qualcosa di simile, ma potrebbe tornare utile se devo lavorare da una console o all'interno di uno script.
Joe,

0

Un modo semplice per vedere cosa c'è dentro è FTP alla macchina con FileZilla. Quindi è possibile utilizzare FileZilla per rinominare la directory.


0

Utilizzare un browser di file come Midnight Commander (testo), Nautilus (GNOME) o Dolphin (KDE) per lavorare con la directory.


0

lavorare con directory (o file) che hanno nomi strani / difficili da digitare:

1) Esegui ls -iper scoprire l'inode del file.

Questa lsopzione ti darà ogni nome di file e un identificatore per questo file sul file system (l'inode)

2) Utilizzare find per eseguire un comando sul file

dire che l'inode era 9961926

potresti correre

 find * -prune -inum 9961926 -exec rm -i {} \;

per eliminare il file

o

 find * -prune -inum 9961926 -exec mv {} other-name \;

per spostarlo su un nome migliore

o anche

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

per dargli un nuovo nome mantenendo il vecchio nome

(presumibilmente, potresti anche eseguire altri comandi. Sfortunatamente non ho potuto usare questa linea per eseguire a cd)

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.