He visto una aplicación para Mac llamada Structurer (aquí un vídeohttp://www.youtube.com/watch?v=kXRjneFTs6Q) que dio una estructura de archivos y carpetas como esta:
/folder1
/folder2
/file1
/folder2.1
/file2.1
creará estos archivos y carpetas en un lugar existente.
Hay algo así para Ubuntu, o ¿cómo puedo crear un script de shell para obtener algo como esto?
Si es posible, también sería genial poder crear archivos usando plantillas.
Respuesta1
La parte complicada es que los archivos y carpetas se muestran de la misma manera, y no hay una forma sencilla de diferenciarlos. Para el archivo 2.1 no hay forma de saber si ( /folder2/folder2.1/file2.1
) es en realidad una carpeta o un archivo dentro de la carpeta 2.1.
Sí, su descripción dice la palabra, *file*
por lo que sabemos que se refiere a archivo, pero para un programa, ¿cómo podría saberlo? Un programa puede distinguir los archivos de las rutas porque a una le sigue otra entrada en el mismo nivel de sangría. PERO, eso conduce a un conjunto de reglas complicadas y confusas.
Le sugiero que utilice una palabra clave o simplemente nombres completos y calificados. Lo más fácil es:
/carpeta1/
/carpeta2/
/carpeta2/archivo1
/carpeta2/carpeta2.1/
/carpeta2/carpeta2.1/archivo2.1
La barra diagonal final significa "Esta es una carpeta y no un archivo". Entonces puede tener un script sencillo como este para crear su estructura de directorio. Un par de advertencias sobre este script.
- Los directorios de nivel superior deben crearse primero.
- Antepongo un "." a la ruta para que todos los directorios creados sean relativos a aquel en el que se ejecuta el script.
- No hago ningún error al verificar el contenido del archivo directorio/ruta.
#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Esto creará los directorios y archivos como se muestra en el archivo de entrada. Si se llama al script create.sh
y lo ha hecho chmod 755 create.sh
, el comando ./create.sh data
generará sus directorios y archivos como se describe en el archivo de datos.