Riga di comando: crea un file con un nuovo nome file se il nome file esiste già


8

Mi chiedevo se fosse possibile avere un comando che crea un file, ma ogni volta che il comando viene eseguito, non sovrascriverebbe il file creato nell'esecuzione precedente.

Ad esempio: touch test1.txtcreerebbe 1 file chiamato test1.txt. Ma la prossima volta che lo eseguo, vorrei che il nuovo file venisse chiamato test2.txt, o qualcosa del genere. Quindi senza sovrascrivere il file già esistente. In un certo senso potrebbe essere eseguito più volte senza problemi.

Non fraintendermi, non sto cercando di creare più file con un solo comando.

Grazie in anticipo!

Risposte:


9

La soluzione più semplice sarebbe quella di aggiungere un timestamp al nome del file e non usare una singola cifra.

Il metodo più semplice per creare un file vuoto sarebbe touch test$(date +%Y%m%d-%H%M%S)e ciò comporterebbe un file denominato test20110802-170410. Una seconda volta test*otterrà un timestamp più recente in modo da generare 2 file.


Questo è proprio quello che stavo cercando, grazie! :)
Nick Lemaire il

Non funziona in uno script (non in attesa tra) - Ho provato touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), ha creato solo un file. Nanosecondi: funziona touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)e touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)crea due file ciascuno.
Volker Siegel,

È meglio usare $()dal momento che permette di espressioni nido, ma è anche possibile utilizzare backticks: touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi,

5

Dubito che esista un comando generale per farlo, ma puoi pensare a qualcosa del genere:

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

Il parametro di input per la funzione è diviso in prefisso, numero, suffisso, quindi fino a quando il file esiste, il numero viene incrementato. Trovato uno slot libero, il file viene creato con touch.

Il meccanismo di suddivisione dovrebbe essere adattato alle proprie esigenze e dovrebbero essere aggiunti vari controlli degli errori.


brillante, ottima funzione.
Marco Ceppi

1

Se non sono richiesti numeri di sequenza, il modo più semplice è usare il mktempcomando.


mktemp genera un nome file univoco e casuale, usando un modello. Probabilmente catturerai l'output di mktemp in una variabile. Da linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan,

Un altro metodo comune è utilizzare l'attuale ID processo, dalla variabile shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.