Dòng lệnh: tạo tệp với tên tệp mới nếu tên tệp đã tồn tại


8

Tôi đã tự hỏi nếu có thể có một lệnh tạo một tệp, nhưng mỗi khi lệnh được thực thi, nó sẽ không ghi đè lên tệp được tạo trong lần thực hiện trước đó.

Ví dụ: touch test1.txtsẽ tạo 1 tệp được gọi test1.txt. Nhưng lần tiếp theo tôi thực hiện nó, tôi muốn tệp mới được gọi test2.txt, hoặc một cái gì đó tương tự. Vì vậy, mà không ghi đè lên các tập tin đã tồn tại. Theo một cách nào đó, nó có thể được thực thi nhiều lần mà không gặp vấn đề gì.

Đừng hiểu lầm tôi, tôi không cố tạo nhiều tệp bằng một lệnh.

Cảm ơn trước!

Câu trả lời:


9

Giải pháp đơn giản nhất là thêm dấu thời gian vào tên tệp và không sử dụng một chữ số.

Phương pháp đơn giản nhất để tạo một tệp trống sẽ là touch test$(date +%Y%m%d-%H%M%S)và điều đó sẽ dẫn đến một tệp có tên test20110802-170410. Lần thứ 2 test*sẽ nhận được dấu thời gian mới hơn vì vậy nó sẽ dẫn đến 2 tệp.


Đây chỉ là những gì tôi đang tìm kiếm, cảm ơn! :)
Nick Lemaire

Không hoạt động trong một tập lệnh (không chờ giữa) - Tôi đã thử touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), nó chỉ tạo một tập tin. Nanoseconds-time hoạt động: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)tạo hai tệp mỗi tệp.
Volker Siegel

Sử dụng tốt hơn $()vì cho phép bạn lồng các biểu thức, nhưng bạn cũng có thể sử dụng backticks : touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi

5

Tôi nghi ngờ một lệnh chung tồn tại để làm điều đó, nhưng bạn có thể nghĩ về một cái gì đó như thế này:

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
}

Tham số đầu vào của hàm được phân chia theo tiền tố, số, hậu tố, sau đó cho đến khi tệp tồn tại, số được tăng lên. Tìm thấy một khe miễn phí, tập tin được tạo bằng touch.

Cơ chế phân chia phải được điều chỉnh theo nhu cầu của bạn và cần thêm các kiểm tra lỗi khác nhau.


rực rỡ, chức năng tuyệt vời.
Marco Ceppi

1

Nếu không yêu cầu số thứ tự, thì cách dễ nhất là sử dụng mktemplệnh.


mktemp tạo một tên tệp ngẫu nhiên, duy nhất, bằng cách sử dụng một mẫu. Bạn có thể nắm bắt đầu ra của mktemp trong một biến. Từ trang linuxman :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan

Một phương pháp phổ biến khác là sử dụng id tiến trình hiện tại, từ biến shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.