Khi bạn ban hành lệnh:
mv *.txt *.tsv
shell, giả sử bash, mở rộng các ký tự đại diện nếu có bất kỳ tệp phù hợp (bao gồm các thư mục). Danh sách các tập tin được chuyển đến chương trình, ở đây mv
. Nếu không tìm thấy kết quả trùng khớp, phiên bản chưa được mở rộng sẽ được thông qua.
Một lần nữa: shell mở rộng các mẫu, không phải chương trình.
Tải các ví dụ có lẽ là cách tốt nhất, vì vậy chúng tôi đi đây:
Ví dụ 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Bây giờ những gì xảy ra trên mv
dòng là shell mở rộng *.txt
đến các tệp phù hợp. Vì không có *.tsv
tập tin nào không thay đổi.
Các mv
lệnh được gọi với hai đối số đặc biệt :
argc
: Số lượng đối số, bao gồm cả chương trình.
argv
: Một mảng các đối số, bao gồm chương trình là mục nhập đầu tiên.
Trong ví dụ trên đó sẽ là:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
Các mv
kiểm tra chương trình để xem nếu đối số cuối cùng, *.tsv
là một thư mục. Vì không phải vậy, chương trình không thể tiếp tục vì nó không được thiết kế để nối các tệp. (Thường di chuyển tất cả các tệp thành một.) Cũng không tạo thư mục theo ý thích.
Kết quả là nó hủy bỏ và báo cáo lỗi:
mv: target ‘*.tsv’ is not a directory
Ví dụ 2:
Bây giờ nếu bạn nói:
$ mv *1.txt *.tsv
Các mv
lệnh được thực thi với:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Bây giờ, một lần nữa, mv
kiểm tra xem nếu *.tsv
tồn tại. Vì nó không phải là tập tin file1.txt
được chuyển đến *.tsv
. Đó là: tập tin được đổi tên thành *.tsv
dấu hoa thị và tất cả.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Ví dụ 3:
Nếu bạn nói:
$ mkdir *.tsv
$ mv *.txt *.tsv
Các mv
lệnh được thực thi với:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Vì *.tsv
bây giờ là một thư mục, các tập tin cuối cùng được chuyển đến đó.
Bây giờ: sử dụng các lệnh như some_command *.tsv
khi có ý định thực sự giữ ký tự đại diện, người ta phải luôn trích dẫn nó. Bằng cách trích dẫn, bạn ngăn các ký tự đại diện được mở rộng nếu có bất kỳ trận đấu nào. Ví dụ nói mkdir "*.tsv"
.
Ví dụ 4:
Việc mở rộng có thể được xem thêm nếu bạn làm ví dụ:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Ví dụ 5:
Bây giờ: mv
lệnh có thể và thực hiện công việc trên nhiều tệp. Nhưng nếu có nhiều thì hai cái cuối cùng phải là một thư mục đích. (Tùy chọn bạn có thể sử dụng -t TARGET_DIR
tùy chọn, ít nhất là cho GNU mv.)
Vì vậy, điều này là OK:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Ở đây mv
sẽ được gọi với:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
và tất cả các tập tin kết thúc trong thư mục foo
.
Đối với các liên kết của bạn. Bạn đã cung cấp một (trong một bình luận), nơi mv
không được đề cập ở tất cả, nhưng rename
. Nếu bạn có nhiều liên kết hơn, bạn có thể chia sẻ. Cũng như cho các trang người đàn ông nơi bạn tuyên bố điều này được thể hiện.