Volevo creare un file chiamato test
. Per caso corro mkdir test
invece di touch test
.
È possibile convertire la test
directory in un file chiamato test
?
Che ne dici di convertire un file chiamato test
in una directory con lo stesso nome?
Volevo creare un file chiamato test
. Per caso corro mkdir test
invece di touch test
.
È possibile convertire la test
directory in un file chiamato test
?
Che ne dici di convertire un file chiamato test
in una directory con lo stesso nome?
Risposte:
Questo non è possibile per nessun Unix o Linux che abbia mai toccato.
In alcuni vecchi Unix, le directory sono file, appositamente contrassegnati, ma comunque file. Ad esempio, si era in grado di leggere una directory con cat
sotto SunOS. Molti file system moderni potrebbero avere directory come alberi B + o qualche altra struttura di dati su disco. Quindi trasformare un file in una directory o viceversa richiederebbe sempre una cancellazione e una ricostruzione con lo stesso nome.
No, non esiste un comando del genere perché non avrebbe assolutamente senso. La tua domanda è come chiedere un modo per trasformare una scatola in un rettangolo piatto. Cosa faresti con le cose nella scatola (directory)? In che modo il rettangolo corrisponderebbe alla scatola da cui proviene?
File e directory svolgono funzioni completamente diverse. Mentre una directory è effettivamente un file nei sistemi * nix, ciò si applica solo agli interni del sistema e non a ciò che tu, l'utente, vedi. Pertanto, la conversione di un file in una directory o viceversa implica sempre l'eliminazione del file e la creazione della directory. Il meglio che si possa sperare sarebbe usare lo stesso inode ma, ancora una volta, non ha molto senso.
Crea una funzione per fare quello che vuoi. ( bash
o ipotizzata altra shell Bourne / POSIX come)
$ dir2file() { rmdir -- "$1" && touch -- "$1";}
$ mkdir adir
$ dir2file adir
$ ls -l adir
-rw-r--r-- 1 xtian xtian 0 2014-03-04 14:59 adir
$
Uso deliberatamente rmdir
ciò che fallirà se adir
non è una directory o non è vuota (no -f
per forzare). touch
verrà eseguito solo se ha rmdir
esito positivo.
È possibile inserire la definizione della funzione nel file di personalizzazione della shell ( .bashrc
per bash
).
--
fa?
--
segna la fine delle bandiere così rmdir
e touch
sanno niente passato è un nome di file, anche se inizia con -
.
Per quelli che si chiedono perché vorresti farlo, segui questa discussione:
Apparentemente un bug nel firmware ha capovolto il bit nella voce della directory per il file, facendo pensare al sistema operativo che fosse una cartella anziché un file.
Anche se non ho il router Linksys in questione, qualcosa ha cambiato tutti i miei file .jpg in cartelle vuote. Se c'è un modo per capovolgere il bit (o qualsiasi altra cosa) che dice che una voce della directory NTFS è una cartella rispetto a un file, mi piacerebbe saperlo.
Una delle soluzioni in quel thread lungo 2 anni ha detto che se il disco rigido contenente le cartelle che erano usate per essere file è collegato a un Mac con OS / X, il Mac li vedrà di nuovo come file e loro può essere copiato in una cartella sul Mac. Non ho un Mac per provarlo, quindi se qualcuno conosce un modo per capovolgere ...
Innanzitutto, accedi al terminale ed esegui ls -al file
con il file è il file che desideri riconvertire in una cartella ATTUALE. Se sono elencati file e sottodirectory, significa che il tuo "file" era in precedenza una cartella con contenuti reali e puoi continuare:
Eseguire:
sudo chmod 700 /
O
sudo chmod 700 file
Riavviare il sistema e riottenere l'accesso al terminale ed eseguire:
sudo chmod 744 /
O
sudo chmod 744 file
RICORDA: "file" deve essere sostituito dal file che si desidera riconvertire in una cartella ATTUALE.
Questo è solo un modo arbitrario per risolvere questo problema, ma crea anomalie di autorizzazione che è possibile utilizzare fsck -f
per correggere (anche se non montate ovviamente) o impostare manualmente nuove autorizzazioni, se necessario.
DI NUOVO, questo è solo un modo provato per evitare di dover eliminare il file che in precedenza era una cartella non vuota.
rm -f test && touch test
a parte questo, non lo so davvero