Tengo este script
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Funciona, solo eso, para un archivo llamado 001.png
, crea en 001.png.txt
lugar de 001.txt
.
¿Cómo puedo modificar esto?
Tengo este script
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Funciona, solo eso, para un archivo llamado 001.png
, crea en 001.png.txt
lugar de 001.txt
.
¿Cómo puedo modificar esto?
Respuestas:
Puedes usar el basename
comando aquí:
touch "$folder/$(basename "$filePng" .png).txt"
Tenga en cuenta el adicional $folder/
. Esto es necesario ya que el comando basename elimina la ruta de.
$filePng
, también fueron útiles.
$( )
establece un nuevo contexto de citas.
Puede eliminar la extensión existente utilizando las funciones de expansión de parámetros del shell
${parameter%pattern}
El 'patrón' se compara con el final del 'parámetro'. El resultado es el valor expandido de 'parámetro' con la coincidencia más corta eliminada.
Entonces, en su caso, reemplace $filePng.txt
con"${filePng%.png}.txt"
Con la variación de lo que Steeldriver ya mencionó (expansión de parámetros), podemos usar el reemplazo de cuerdas para hacer el trabajo. Además, debe citar variables. A continuación se muestra su guión editado.
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in "$folder"/*
do
touch "${filePng/.png/.txt}"
done
Si tiene muchos archivos para crear, valdría la pena "tocar" más de un archivo a la vez, de modo que no necesite bifurcar un nuevo proceso para cada uno de ellos (lo que lleva bastante tiempo si se realizan múltiples Mil veces).
xargs
Esta opción proporcionará múltiples rutas al touch
comando a la vez, generalmente unos pocos miles o lo que el sistema pueda caber en una sola línea de comando.
find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --
Esta opción no se ejecuta touch
en absoluto, sino que utiliza características de shell Bash / Bourne / POSIX que no requieren subprocesos en absoluto.
for f in "$folder"/*.png; do
: >> "${f%.png}.txt"
done
Si está seguro de que no tiene archivos en .png
algún lugar en el medio del nombre, puede usar una matriz con expansión de parámetros:
pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"
Esto almacena todas las rutas a los archivos que terminan en .png
una matriz y luego usa la expansión de parámetros para crear la lista de .txt
archivos, sustituyéndola .png
por .txt
cada uno.
Tenga en cuenta que esto se romperá si tiene tantos archivos que no se pueden pasar todos como argumentos a la misma invocación de touch
.
for filePng in "$folder"/*
ytouch "$filePng".txt
, tenga en cuenta que solo los cita cuando está precedido por a$
.