Đây là một thay thế cho kịch bản của Joseph R không có sự cảnh báo nào! Nó sẽ nối một hậu tố số vào một tên đường dẫn (đường dẫn có thể là một thư mục hoặc một tệp), tăng giá trị hậu tố cho đến khi tìm thấy một hậu tố chưa tồn tại. Các tiện ích khác như logrotate
sử dụng một mẫu tương tự, nhưng xoay tất cả các bản sao hiện có để cái mới luôn có '0' cho hậu tố. Vì đây không phải là một vòng quay theo nghĩa đó, tôi sẽ gọi nó dotmv
. Chỉ cần nhớ rằng đó file.0
sẽ là bản sao cũ nhất .
Ví dụ:
dotmv somefile.txt
Đổi tên somefile.txt
somefile.txt.0
, trừ khi cái sau tồn tại, trong trường hợp đó sẽ là somefile.txt.1
, và như vậy. Bạn có thể liệt kê nhiều hơn một tệp ( dotmv this that "the other thing"
v.v.), tất cả chúng sẽ được di chuyển theo dấu chấm.
Tôi tin rằng đây là tuân thủ POSIX - nó chạy với set -o posix
bash (nhưng đó là một thử nghiệm đáng ngờ). Tôi cũng đã thử nghiệm với trình bao Android (thạch đậu 4.2.1) và nó hoạt động ở đó. Tuy nhiên, trên Android, bạn sẽ cần thay đổi shebang như được chỉ định hoặc chạy nó sh dotmv
- dù sao bạn cũng sẽ trừ khi bạn có một thiết bị đã root, bởi vì không có cách nào để tạo một tập lệnh thực thi theo cách khác. Thay đổi shebang sẽ cho phép bạn sử dụng exec dotmv
.
#!/bin/sh
# On android change that to /system/bin/sh.
# Validate arguments
if [ $# -lt 1 ]; then
echo "A list of one or more paths is required."
exit 1
fi
# Checks if a path exists and can be moved.
checkPath () {
if [ ! -e "$1" ]; then
echo "'$1' does not exist."
return 1;
fi
if [ ! -w "$1" ]; then
echo "Cannot move '$1', permission denied."
return 1;
fi
return 0;
}
# Finds a new path with numerical suffix.
getName () {
suf=0;
while [ -e "$1.$suf" ]
do let suf+=1
done
Dest=$1.$suf
}
# Loop through arguments -- use quotes to allow spaces in paths.
while (($#)); do
Src=$1
Dest=$1
shift
checkPath "$Src"
if [ $? -eq 0 ]; then
getName "$Src"
mv "$Src" "$Dest"
fi
done
Hy vọng logic ở đây là rất đơn giản. Điều này có thể được thực hiện bằng python, C hoặc bất kỳ ngôn ngữ thủ tục hoàn chỉnh nào khác với tệp I / O.