Ghi đè tập tin chỉ khi dữ liệu


8

Tôi đang cố gắng ghi đè một tập tin với đầu ra lệnh, nhưng chỉ khi có bất kỳ đầu ra. Đó là, tôi thường muốn

mycommand > myfile

nhưng nếu điều này sẽ ghi đè lên myfiledữ liệu trống, tôi muốn giữ lại phiên bản cũ của myfile. Tôi nghĩ rằng một cái gì đó sử dụng ifnenên có thể, một la

mycommand | ifne (cat > myfile) 

nhưng nó không hoạt động ...

Một cách tiếp cận gián tiếp

mycommand | tee mytempfile | ifne mv mytempfile myfile

hoạt động, nhưng tôi coi việc sử dụng tập tin tạm thời đó là không phù hợp.

Q: Tại sao ý tưởng đầu tiên của tôi không hoạt động? Nó có thể được thực hiện công việc? Hoặc có một giải pháp tốt đẹp và có lẽ hoàn toàn khác cho vấn đề ban đầu của tôi?


5
"Chuyển hướng đến một tệp riêng biệt, kiểm tra kích thước của tệp đó và có thể đổi tên nó" có vẻ khá đơn giản đối với tôi. Tại sao không sử dụng một tập tin tạm thời?
Jeff Schaller

Câu trả lời:


18

Cách tiếp cận đầu tiên của bạn hoạt động, bạn chỉ cần đưa ra một lệnh cho ifne(xem man ifne):

NAME
       ifne - Run command if the standard input is not empty

SYNOPSIS
       ifne [-n] command

DESCRIPTION
       ifne  runs  the  following command if and only if the standard input is
       not empty.

Vì vậy, bạn cần phải cung cấp cho nó một lệnh để chạy. Bạn sắp ở đó, teesẽ làm việc:

command | ifne tee myfile > /dev/null

Nếu lệnh của bạn không tạo ra một lượng dữ liệu khổng lồ, nếu nó đủ nhỏ để khớp với một biến, bạn cũng có thể thực hiện:

var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile

8

Giải pháp cho người đi bộ:

tmpfile=$(mktemp)

mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
    cat "$tmpfile" >myfile
fi

rm -f "$tmpfile"

Đó là, lưu kết quả đầu ra vào một tệp tạm thời, sau đó kiểm tra xem nó có trống hay không. Nếu nó không trống, sao chép nội dung của nó trên tập tin của bạn. Cuối cùng, xóa tập tin tạm thời.

Tôi đang sử dụng cat "$tmpfile" >myfilechứ không phải cp "$tmpfile" myfile(hoặc mv) để có được hiệu ứng giống như bạn đã nhận được mycommand >myfile, tức là cắt bớt tệp hiện có và giữ quyền sở hữu cũng như quyền.

Nếu $TMPDIR(được sử dụng bởi mktemp) trên một hệ thống tập tin gắn trên bộ nhớ, thì điều này sẽ không ghi vào đĩa ngoài khả năng khi ghi vào myfile. Nó cũng sẽ dễ mang theo hơn là sử dụng ifne.

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.