Trova il nome file numerato più alto in una directory in cui i nomi iniziano con le cifre
Domanda
Ho una directory con file che sembrano così:
001_something.php 002_something_else.php
004_xyz.php 005_do_good_to_others.php
Alla fine voglio creare un nuovo file PHP vuoto il cui nome inizia con il numero successivo nella serie.
LIST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | tr '\n' ' '`
Il codice precedente mi dà una stringa come questa:
LIST='001 002 004 005 '
Voglio afferrare che 005, incremento di uno e quindi utilizzare quel numero per generare il nuovo nome file. Come lo faccio a Bash?
Soluzione
$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever
Quindi, questo è specifico per Bash. Di seguito è riportato a Qualsiasi base-shell-shell-incluso Soluzione, anche se immagino che sia possibile qualcosa di più semplice.
$ 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
$
Altri suggerimenti
Hai bisogno dell'intero elenco?
Altrimenti
LAST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`
ti darò solo la parte 005 e
printf "%03d" `expr 1 + $LAST`
Stamperò il prossimo numero nella sequenza.
Utilizzando solo strumenti standard, i seguenti ti forniranno il prefisso per il nuovo file (006):
ls [0-9]* | sed 's/_/ _/' | sort -rn | awk '{printf "%03d", $1 + 1; exit}'
Questo sembra essere più semplice.
ls [0-9]* | sort -rn | awk '{FS="_"; printf "%03d_new_file.php\n",$1+1;exit}'
Veloce, senza subshell e senza loop (gestisce anche i nomi di file con spazi)*:
list=([0-9]*)
last=${list[@]: -1}
nextnum=00$((10#${last%%[^0-9]*} + 1))
nextnum=${nextnum: -3}
touch ${nextnum}_a_new_file.php
Dato il tuo esempio file l'output sarebbe:
006_a_new_file.php
$ for file in *php; do last=${file%%_*} ; done
$ newfilename="test.php"
$ printf "%03d_%s" $((last+1)) $newfilename
006_test.php
Ti lascio fare la creazione di un nuovo file
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)))
Pubblico questa risposta per proporre una soluzione minima alla domanda principale "Trova il nome file più alto in una directory in cui i nomi iniziano con le cifre":
ls -1 "$MyDir" | sort -hr | head -n 1
La prima affermazione pubblica i file in mydir come fodera con l'opzione -1. Questo è condotto alla funzione di ordinamento che ordina in ordine numerico umano con -h e in ordine inverso (prima numero più alto) con -r. Questo è condotto alla funzione della testa che fornisce solo i risultati più alti (1 nell'esempio). La risposta considera l'ordinamento numerico umano IE 221 è superiore a 67. È una soluzione di shell Posix così altamente compatibile.
Ecco una soluzione (hai bisogno di 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