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}''
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)))