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
?tr
enfoque, me acabo de dar cuenta de que loparallel
tiene 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.txt
lugar de solocut dirlist.txt
?Debe configurar su
IFS='/'
pararead
y luego asignar cada primer campo en una variable separadafirst
y el resto de los campos en variablerest
y simplemente trabajar en el valor del primer campo (o puederead -ar array
hacerlo 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 comandomkdir
se 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:
echo
delante demkdir
para crear esos directorios.-d'\n'
con-0
si su lista está separada con caracteres NUL en lugar de una línea\n
electró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
cut
y pase la salida amkdir
través dexargs
Para 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 c
como la sugerida por @OleTange en los comentarios, uno puede recurrirawk
a crear una lista separada por nulos en lugar de una lista separada por nueva línea.@dessert en los comentarios se preguntó si
printf
se 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
printf
se 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.txt
para 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