una texto renombrar que por listar letra extension empiecen ejemplos directorio crear comandos carpeta buscar basicos archivos archivo bash shell sed ls

texto - BASH: Encuentra el nombre de archivo con el número más alto en un directorio donde los nombres comienzan con dígitos(ls, sed)



listar archivos en linux que empiecen por una letra (8)

¿Necesitas toda la LISTA?

Si no

LAST=`exec ls $MY_DIR | sed ''s//([0-9]/+/).*//1/g'' | sort -n | tail -1`

le dará solo la parte 005 y

printf "%03d" `expr 1 + $LAST`

imprimirá el siguiente número en la secuencia.

Tengo un directorio con archivos que se ven así:

001_something.php 002_something_else.php 004_xyz.php 005_do_good_to_others.php

En última instancia, quiero crear un nuevo archivo PHP vacío cuyo nombre comience con el siguiente número de la serie.

LIST=`exec ls $MY_DIR | sed ''s//([0-9]/+/).*//1/g'' | tr ''/n'' '' ''`

El código anterior me da una cadena como esta:

LIST=''001 002 004 005 ''

Quiero tomar ese 005, incrementarlo en uno, y luego usar ese número para generar el nuevo nombre de archivo. ¿Cómo hago eso en BASH?


Aquí hay una solución (necesitas bc):

#!/bin/bash LIST=''001 002 008 005 004 002 '' a=0 for f in $LIST do t=$(echo $f + 1|bc) if [ $t -ge $a ] then a=$t fi done printf "%03d/n" $a


Rápido, sin subsellas y sin bucles (también maneja nombres de archivos con espacios) *:

list=([0-9]*) last=${list[@]: -1} nextnum=00$((10#${last%%[^0-9]*} + 1)) nextnum=${nextnum: -3} touch ${nextnum}_a_new_file.php

Dado sus archivos de ejemplo, la salida sería:

006_a_new_file.php


Usando solo herramientas estándar, lo siguiente le dará el prefijo para el nuevo archivo (006):

ls [0-9]* | sed ''s/_/ _/'' | sort -rn | awk ''{printf "%03d", $1 + 1; exit}''


$ for file in *php; do last=${file%%_*} ; done $ newfilename="test.php" $ printf "%03d_%s" $((last+1)) $newfilename 006_test.php

te dejo hacer la creación de un nuevo archivo


$ LIST=($LIST) $ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))` $ echo $newfile 006-whatever

Entonces, eso es específico de bash. A continuación se muestra una solución any-posix-shell-including-bash , aunque imagino que algo más simple es posible.

$ cat /tmp/z f () { eval echo /${$#} | sed -e ''s/^0*//'' } LIST=''001 002 004 005 '' newname=`printf %03d-whatever $(($(f $LIST) + 1))` echo $newname $ sh /tmp/z 006-whatever $


Esto parece ser más simple.

ls [0-9]* | sort -rn | awk ''{FS="_"; printf "%03d_new_file.php/n",$1+1;exit}''


  1. touch "newfile_$(printf "%03d" $(echo $(ls 00?_*.php|sed ''s/_.*//''|sort -rn|head -1)+1|bc))"

    2.

    num=$(ls 00?*.php|sed ''s/.*//''|sort -rn|head -1) touch $(printf "newfile_%03d" $((num+1)))