Tengo un archivo .txt que contiene un texto como este
A1/B1/C1
A2/B2/C2
A3/B3/C3
Quiero un script que lea el archivo .txt para cada línea y luego cree un directorio basado en la primera palabra (A1, A2, A3)
He creado un script como este:
file="test.txt"
while IFS='' read -r line
do
name="line"
mkdir -p $line
done <"$file"
Mientras lo ejecuto, crea el directorio A1 y luego también crea los subdirectorios B1 y C1. Lo mismo ocurre con otra línea (A2 * y A3 *)
¿Qué debo hacer para crear solo directorios A1, A2, A3?
No quiero que el nombre sea A1 / B1 / C1 con el carácter '/'. Solo quiero tomar la palabra antes del carácter '/' y convertirla en el nombre del directorio. Solo "A1" "A2" "A3".
fuente

xargs -a<(....)lugar de<dirlist.txt cut -d/ -f1 | xargs?trenfoque, me acabo de dar cuenta de que loparalleltiene cubierto por defecto.xargs -a<(....)Por qué en lugar de una tubería ? Porque me gusta de esta manera, tan simple como eso. :)<(...)ayuda con los espacios también, por lo que definitivamente es la mejor opción: no creo que nadie estuviera usando este descriptor de archivos de todos modos.cut <dirlist.txtlugar de solocut dirlist.txt?Debe configurar su
IFS='/'paraready luego asignar cada primer campo en una variable separadafirsty el resto de los campos en variableresty simplemente trabajar en el valor del primer campo (o puederead -ar arrayhacerlo en una sola matriz y usar"${array[0]}"para el valor del primer campo):O en una sola línea para quienes les gusta:
O cree todos los directorios de una vez:
La cita ANSI-C
$'...'se utiliza para tratar con nombres de directorio que contienen caracteres especiales.Tenga en cuenta que el
_(puede ser cualquier carácter o cadena) al final será argv [0]bash -c '...'y el$@testamento contiene el resto de los parámetros a partir de 1; sin eso en el segundo comandomkdirse perderá el primer parámetro al .Al
${1%%/*}usar la expansión de sustitución de parámetros de shell (POSIX sh / bash / Korn / zsh) , elimina la coincidencia más larga posible de una barra inclinada seguida de cualquier cosa hasta el final del parámetro que pasa, que es una línea que se lee por xargs ;PD:
echodelante demkdirpara crear esos directorios.-d'\n'con-0si su lista está separada con caracteres NUL en lugar de una línea\nelectrónica (se supone que hay / hay una nueva línea incrustada en el nombre de su directorio).fuente
Contenido de
test.txt:Script para crear
A[123]carpetas:Salida de
ls:fuente
A 12"x4" dir/B b/C c:?Para un caso simple como se muestra en el ejemplo de entrada de la pregunta, simplemente use
cuty pase la salida amkdirtravés dexargsPara manejar casos donde el nombre del directorio puede contener espacios, podríamos agregar
-d '\n'a la lista de opciones:Para variaciones más complejas,
A 12"x4" dir/B b/C ccomo la sugerida por @OleTange en los comentarios, uno puede recurrirawka crear una lista separada por nulos en lugar de una lista separada por nueva línea.@dessert en los comentarios se preguntó si
printfse puede usar en lugar decut, y técnicamente hablando, se puede usar, por ejemplo, limitando la cadena impresa al ancho de solo 3 caracteres:No es la forma más limpia, pero demuestra que
printfse puede usar. Por supuesto, esto se vuelve problemático si el nombre del directorio tiene más de 3 caracteres.fuente
A 12"x4" dir/B b/C c:?usando Perl:
O
si queremos aceptar espacios en los nombres de directorio
fuente
perl -ne 'mkdir for /^([^\/]+)/' list.txtpara cubrir espacios en nombres de directorios. Finalmente necesito aprender Perl, ¡gracias!GNU Parallel puede ser excesivo para la tarea, pero si va a hacer otras cosas para cada línea, entonces puede ser útil:
Trata correctamente con entradas como:
fuente