¿Es posible cambiar el nombre del archivo con el número de secuencia usando {1..10}

¿Es posible cambiar el nombre del archivo con el número de secuencia usando {1..10}

Tengo dudas. Tengo que cambiar el nombre del archivo con el número de secuencia del 1 al 10. Puedo crear un archivo con el siguiente parámetro.

touch file.$(date +%Y).$$.{1..10}

Pero no puedo cambiar el nombre del archivo usando el siguiente comando. ¿Por qué {1..10} no funciona? Porque quiero cambiar el nombre de un archivo como. ¿El comando mv tomará {1..10}?

file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.

entonces el siguiente comando es correcto?

for file in $(ls);
do

mv $file file.$(date +%Y%m).$$.{1..10}
done

Respuesta1

La expansión de llaves {1..10}hará que la línea de comando se expanda para incluir varios argumentos.

Por ejemplo, la touchlínea de comando se expandirá a algo como

touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10

antes de ser ejecutado. Esto está bien ya que la touchutilidad toma cualquier número de argumentos en la línea de comando. Nota: esto crea 10 archivos, no un archivo.

Sin embargo, la mvutilidad tiene una semántica diferente en comparación con touch. Espera uno o varios archivos/directorios de origen y un único archivo/directorio de destino al final.

Esto significa que cuando

mv $file $file.$(date +%Y%m).$$.{1..10}

se expande a algo como

mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10

se supone que quieres mudartetodolos archivos, excepto lo último en la línea de comando. Además, espera que lo último en la línea de comando sea un nombre de directorio (ya que estás moviendo varias cosas).

No me queda claro qué es lo que realmente quieres hacer en ese bucle, por lo que no puedo comentar más sobre cómo resolver este problema.

Cuando se trata del bucle en sí,por favorNunca uses la salida de lsesa manera. En lugar de eso, hazlo

for file in ./*; do
    # process "$file"
done

La salida de lses para que ustedmira a, no es apto para ser consumido por un script por varias razones. Verhttp://unix.stackexchange.com/questions/128985/why-not-parse-ls

Además, siempre entrecomilla dos veces tus variables. Verhttp://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells

información relacionada