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!

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.


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.


brilian, fungsi luar biasa.
Marco Ceppi

1

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.