Baris perintah: buat file dengan nama file baru jika nama file sudah ada

8

Saya bertanya-tanya apakah mungkin memiliki perintah yang membuat satu file, tetapi setiap kali perintah dijalankan, itu tidak akan menimpa file yang dibuat dalam eksekusi sebelumnya.

Misalnya: touch test1.txtakan membuat 1 file bernama test1.txt. Tetapi lain kali saya mengeksekusinya, saya ingin file baru dipanggil test2.txt, atau semacamnya. Jadi tanpa menimpa file yang sudah ada. Dengan cara itu bisa dijalankan beberapa kali tanpa masalah.

Jangan salah paham, saya tidak mencoba membuat banyak file dengan satu perintah.

Terima kasih sebelumnya!

Nick Lemaire
sumber

Jawaban:

9

Solusi termudah adalah dengan menambahkan timestamp ke nama file dan tidak menggunakan satu digit.

Metode termudah untuk membuat file kosong adalah touch test$(date +%Y%m%d-%H%M%S)dan itu akan menghasilkan file bernama test20110802-170410. Waktu ke-2 test*akan mendapatkan cap waktu yang lebih baru sehingga akan menghasilkan 2 file.

Rinzwind
sumber
Ini hanya apa yang saya cari, terima kasih! :)
Nick Lemaire
Tidak berfungsi dalam skrip (tidak menunggu di antara) - Saya mencoba touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), itu hanya membuat satu file. Nanoseconds-time berfungsi: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)dan touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)masing-masing membuat dua file.
Volker Siegel
Lebih baik menggunakan $()karena memungkinkan Anda untuk ekspresi sarang, tetapi Anda juga dapat menggunakan tanda kutip mundur: touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi
5

Saya ragu ada perintah umum untuk melakukan itu, tetapi Anda dapat memikirkan sesuatu seperti ini:

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
}

Parameter input ke fungsi ini dibagi menjadi awalan, angka, akhiran, kemudian sampai file ada, jumlahnya bertambah. Menemukan slot gratis, file dibuat dengan touch.

Mekanisme pemisahan harus disesuaikan dengan kebutuhan Anda, dan berbagai pemeriksaan kesalahan harus ditambahkan.

enzotib
sumber
brilian, fungsi luar biasa.
Marco Ceppi
1

Jika nomor urut tidak diperlukan, maka cara termudah adalah menggunakan mktempperintah.

Michał Šrajer
sumber
mktemp menghasilkan nama file acak dan unik, menggunakan templat. Anda mungkin menangkap output mktemp dalam suatu variabel. Dari linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan
Metode umum lainnya adalah dengan menggunakan id proses saat ini, dari variabel shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan