Trasforma una directory in file o un file in directory


15

Volevo creare un file chiamato test. Per caso corro mkdir testinvece di touch test.

È possibile convertire la testdirectory in un file chiamato test?

Che ne dici di convertire un file chiamato testin una directory con lo stesso nome?


5
rm -f test && touch testa parte questo, non lo so davvero
Kiwy

@Kiwy Sì, ma sto immaginando un comando integrato progettato per svolgere questo compito.
Ionică Bizău,

Risposte:


12

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 catsotto 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.


1
Interessante. Se nessuno arriva con una soluzione, segnerò questa risposta. :-)
Ionică Bizău

5

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.


Dire che non ha senso è la tua opinione, non un fatto tecnico.
Sridhar Sarnobat,

@ user7000 cosa faresti con i contenuti di una directory quando "convertirai" in un file?
terdon

Un file system memorizza i dati in una struttura ad albero. In informatica, i nodi dell'albero che sono nodi foglia possono diventare nodi interni quando si aggiungono dei figli. E no, non ho intenzione di utilizzare un database quando è sufficiente un file system.
Sridhar Sarnobat,

2

Crea una funzione per fare quello che vuoi. ( basho 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 rmdirciò che fallirà se adirnon è una directory o non è vuota (no -fper forzare). touchverrà eseguito solo se ha rmdiresito positivo.

È possibile inserire la definizione della funzione nel file di personalizzazione della shell ( .bashrcper bash).


@Stephane Chazelas Che cosa --fa?
X Tian

2
le --segna la fine delle bandiere così rmdire touchsanno niente passato è un nome di file, anche se inizia con -.
Kevin

2

Per quelli che si chiedono perché vorresti farlo, segui questa discussione:

https://community.linksys.com/t5/Wireless-Routers/Media-files-changing-to-folder-types/td-p/504192/highlight/true

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 ...


1

Innanzitutto, accedi al terminale ed esegui ls -al filecon 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.


Approccio interessante ...
eyoung100
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.