
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 touch
lí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 touch
utilidad toma cualquier número de argumentos en la línea de comando. Nota: esto crea 10 archivos, no un archivo.
Sin embargo, la mv
utilidad 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 ls
esa manera. En lugar de eso, hazlo
for file in ./*; do
# process "$file"
done
La salida de ls
es 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