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 mvdòng là shell mở rộng *.txtđến các tệp phù hợp. Vì không có *.tsvtập tin nào không thay đổi.
Các mvlệ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 mvkiểm tra chương trình để xem nếu đối số cuối cùng, *.tsvlà 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 mvlệ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, mvkiểm tra xem nếu *.tsvtồ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 *.tsvdấ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 mvlệnh được thực thi với:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Vì *.tsvbâ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 *.tsvkhi 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ờ: mvlệ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_DIRtù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 mvsẽ đượ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 mvkhô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.