Transforme un directorio en archivo o un archivo en directorio

15

Quería crear un archivo llamado test. Accidentalmente corro en mkdir testlugar de touch test.

¿Es posible convertir el testdirectorio en un archivo llamado test?

¿Qué pasa con la conversión de un archivo nombrado testen un directorio con el mismo nombre?

Ionică Bizău
fuente
55
rm -f test && touch testexcepto esto, realmente no lo sé
Kiwy
@Kiwy Sí, pero estoy imaginando un comando incorporado que está diseñado para realizar esta tarea.
Ionică Bizău

Respuestas:

12

Esto no es posible para ningún Unix o Linux que haya tocado.

Bajo algunos Unixes más antiguos, los directorios son archivos, especialmente marcados, pero aún son archivos. Solía ​​poder leer un directorio con catSunOS, por ejemplo. Muchos sistemas de archivos modernos pueden tener directorios como árboles B + o alguna otra estructura de datos en disco. Por lo tanto, convertir un archivo en un directorio o viceversa siempre requerirá una eliminación y una recreación con el mismo nombre.

Bruce Ediger
fuente
1
Interesante. Si nadie viene con una solución, marcaré esta respuesta. :-)
Ionică Bizău
5

No, no existe tal comando porque no tendría absolutamente ningún sentido. Su pregunta es como pedir una forma de transformar una caja en un rectángulo plano. ¿Qué harías con las cosas en el cuadro (directorio)? ¿Cómo correspondería el rectángulo a la caja de donde vino?

Los archivos y directorios cumplen funciones completamente diferentes. Si bien un directorio es de hecho un archivo en los sistemas * nix, eso solo se aplica a las partes internas del sistema y no a lo que usted, el usuario, ve. Por lo tanto, convertir un archivo a un directorio, o viceversa, siempre implicará eliminar el archivo y crear el directorio. Lo mejor que puede esperar es usar el mismo inodo pero, de nuevo, no tiene mucho sentido.

terdon
fuente
Decir que no tiene sentido es su opinión, no un hecho técnico.
Sridhar Sarnobat
@ user7000 ¿qué haría con el contenido de un directorio cuando "convierta" a un archivo?
terdon
Un sistema de archivos almacena datos en una estructura de árbol. En informática, los nodos de árbol que son nodos de hoja pueden convertirse en nodos internos cuando se les agregan hijos. Y no, no voy a usar una base de datos cuando un sistema de archivos sea suficiente.
Sridhar Sarnobat
2

Crea una función para hacer lo que quieras. ( bashu otro Bourne / POSIX como shell asumido)

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

Deliberadamente uso rmdircual fallará si adirno es un directorio o no está vacío (no -fforzar). touchsolo se ejecutará si rmdirtiene éxito.

Puede poner la definición de la función en su archivo de personalización de shell ( .bashrcpara bash).

X Tian
fuente
@Stephane Chazelas ¿Qué hace --?
X Tian
2
las --marca el final de las banderas así rmdiry touchsaben nada más allá que es un nombre de archivo, incluso si se comienza con -.
Kevin
2

Para aquellos que se preguntan por qué querrían hacer esto, sigan este hilo:

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

Aparentemente, un error en el firmware volcó el bit en la entrada del directorio para el archivo, haciendo que el sistema operativo piense que es una carpeta en lugar de un archivo.

Si bien no tengo el enrutador Linksys en cuestión, algo cambió todos mis archivos .jpg en carpetas vacías. Si hay alguna forma de voltear el bit (o lo que sea) que dice que una entrada de directorio NTFS es una carpeta frente a un archivo, me gustaría saberlo.

Una de las soluciones en ese hilo de 2 años dice que si el disco duro que contiene las carpetas que solían ser archivos está conectado a una Mac con OS / X, la Mac los verá nuevamente como archivos y se puede copiar a una carpeta en la Mac. No tengo una Mac para probar eso, así que si alguien sabe una forma de voltear el bit ...

Peter Dow
fuente
1

Primero, obtenga acceso al terminal y ejecute ls -al filecon el archivo que es el archivo que desea convertir nuevamente en una carpeta ACTUAL. Si hay archivos y subdirectorios en la lista, significa que su "archivo" era anteriormente una carpeta con contenido real y puede continuar:

Ejecutar:

sudo chmod 700 /

O

sudo chmod 700 file

Reinicie el sistema y recupere el acceso a la terminal y ejecute:

sudo chmod 744 /

O

sudo chmod 744 file

RECUERDE: "archivo" debe ser reemplazado por el archivo que desea volver a convertir en una carpeta REAL.

Esta es solo una forma arbitraria de resolver este problema, pero crea anomalías de permisos que puede usar fsck -fpara corregir (mientras no está montado, por supuesto) o establecer manualmente nuevos permisos según sea necesario.

DE NUEVO, esta es solo una forma comprobada de evitar tener que eliminar el archivo que anteriormente era una carpeta no vacía.

Alex S.
fuente
Enfoque interesante ...
eyoung100