Sự khác biệt giữa 'đổi tên' và 'mv' là gì?


12

Nó không hoàn toàn rõ ràng với tôi, nhưng sự khác biệt giữa mvrename(từ ) util-linux-ng 2.17.2/usr/bin/renamegì? Có lợi thế của cái này hơn cái kia ngoài renameviệc chấp nhận các biểu thức thông thường và mvkhông? Tôi tin rằng renamecũng có thể xử lý nhiều lần đổi tên tập tin cùng một lúc, trong khi mvkhông làm điều này.

Tôi không thể tìm thấy một dấu hiệu rõ ràng trong các mantrang của họ những gì khác làm cho họ tách biệt hoặc thông qua một số điều tra của riêng tôi.


2
Hãy chắc chắn rằng chúng ta đang nói về những điều tương tự; các đầu ra từ type -a renamevà là rename --versiongì?
Jeff Schaller

@JeffSchaller Đó là một sự tò mò về phần tôi, nhưng trên một trong những máy * nix của tôi, tôi nhận được rename is /usr/bin/renamerename (util-linux-ng 2.17.2)tương ứng.
Urda

6
Có một vài tên khác nhau ngoài đó , và nó có thể là bí danh / hàm / script, vì vậy tôi chỉ muốn chắc chắn rằng chúng ta biết nó là gì. Cảm ơn bạn! Xin vui lòng chỉnh sửa những đầu ra vào câu hỏi của bạn.
Jeff Schaller

@JeffSchaller không phải lo lắng, thực sự liên kết này là một liên kết mà tôi vừa tìm thấy cho thấy tôi renamecó thể có nghĩa là những điều khác nhau trong các bản phát hành khác nhau.
Urda

5
Có vẻ như câu hỏi của bạn chứa câu trả lời của nó. Sự khác biệt giữa máy bay phản lực và xe ba bánh, ngoài thực tế là máy bay phản lực có thể bay và có thể đi nhanh hơn hàng nghìn lần? :-)
G-Man nói 'Tái lập Monica'

Câu trả lời:


21

Về cơ bản, đó là những gì nó nói trên nắp, cho cả hai.

mvlà một tiện ích tiêu chuẩn để di chuyển một hoặc nhiều tệp đến một mục tiêu nhất định. Nó có thể được sử dụng để đổi tên một tệp, nếu chỉ có một tệp để di chuyển. Nếu có một số, mvchỉ hoạt động nếu mục tiêu là thư mục và di chuyển các tệp ở đó.

Vì vậy, mv foo barsẽ di chuyển tệp foovào thư mục bar(nếu nó tồn tại) hoặc đổi tên foothành bar(nếu barkhông tồn tại hoặc không phải là một thư mục). mv foo1 foo2 barsẽ chỉ di chuyển cả hai tệp vào thư mục barhoặc khiếu nại nếu barkhông phải là thư mục.

mvsẽ gọi rename()hàm thư viện C để di chuyển các tệp và nếu điều đó không hoạt động (chúng đang được chuyển sang hệ thống tệp khác), nó sẽ sao chép các tệp và xóa bản gốc.

Nếu tất cả những gì bạn có là mvvà bạn muốn đổi tên nhiều tệp, bạn sẽ phải sử dụng vòng lặp shell. Có một số câu hỏi trên mà ở đây trên trang web, xem ví dụ này , này , và những người khác .


Mặt khác, các renametiện ích khác nhau đổi tên các tệp, riêng lẻ.

Các renametừ util-linux mà bạn đề cập đến làm cho một chuỗi đơn giản thay thế, ví dụ như rename foo bar *sẽ thay đổi foobarđể barbar, và asdffoođể asdfbar. không , tuy nhiên, có một biểu hiện thường xuyên!

Tiện ích đổi tên Perl ( hoặc các phiên bản khác nhau của nó ) lấy biểu thức Perl để chuyển đổi tên tệp. Một người rất có thể sẽ sử dụng một lệnh, trong đó mẫu một biểu thức chính quy.s/pattern/replacement/

Cả việc đổi tên linux và đổi tên Perl đều có thể được sử dụng để di chuyển các tệp sang thư mục khác cùng một lúc, bằng cách thực hiện các thay đổi phù hợp với tên tệp, nhưng hơi khó xử. Không thực hiện nhiều hơn gọi rename()trên các tệp, do đó, việc chuyển từ hệ thống tệp này sang hệ thống tệp khác không hoạt động.

Đối với những renamegì bạn có, nó có thể phụ thuộc vào phân phối của bạn và / hoặc những gì bạn đã cài đặt. Hầu hết trong số họ hỗ trợ rename --version, vì vậy hãy sử dụng để xác định cái nào bạn có.


Không chỉ 'biểu thức chính quy' mà còn có chức năng nếu cần
Gilles Quenot

@GillesQuenot, tốt, vâng, bạn có thể làm ví dụ rename '$_=lc' *để viết tên tập tin. Nhưng tôi nghĩ trường hợp phổ biến nhất là sử dụng s///(mà tôi đã đề cập) và phần mẫu của nó là một biểu thức chính quy; Tôi không nghĩ bạn có thể sử dụng một chức năng ở đó. Bạn có thể làm điều đó trong phần thay thế, mặc dù.
ilkkachu

@MyWrathAcademia, ví dụ đầu tiên trong trang man hoạt động với tôi (nó chỉ làm những việc khác với người khác). Ngoài ra, lý do tôi liên kết đến các trang của Debian là vì ít nhất ở đó, người ta đã nói rất rõ rằng trang man dành cho rename.ulvà sẽ dành cho phiên bản linux-linux chứ không phải cho bất kỳ trang nào khác.
ilkkachu

@ilkkachu, bạn có phiền khi thêm một lời giải thích cho ví dụ đầu tiên đó trong câu trả lời của bạn hoặc trong một bình luận. Nó khác với ví dụ trong man renamevì vậy sẽ rất tốt nếu bạn hiểu về ví dụ của debian
MyWrathAcademia

@MyWrathAcademia, tôi giả sử bạn có nghĩa là rename foo foo0 foo?; rename foo foo0 foo??ví dụ, vì đó là sự khác biệt duy nhất giữa hai trang người đàn ông tôi thấy. Cặp lệnh đó hoạt động vì lệnh đầu tiên thêm số 0 vào tên của mỗi tên tệp có một chữ số và sau đó, lệnh thứ hai thêm (một) khác vào mỗi tên tệp hai chữ số. Bộ thứ hai đó bao gồm các tệp được đổi tên bằng lệnh đầu tiên. Sử dụng rename foo foo00 foo?như lệnh đầu tiên cũng hoạt động, nó chỉ thêm hai số không cùng một lúc.
ilkkachu

2

mvchỉ cần thay đổi tên của tệp (nó cũng có thể di chuyển nó sang hệ thống tệp hoặc đường dẫn khác). Bạn đặt cho nó một tên cũ và một tên mới, và nó thay đổi tệp thành tên hoặc vị trí mới. renameđược sử dụng để thực hiện thay đổi đặt tên hàng loạt. Giả sử bạn có một nghìn tệp, foo000.logthông qua foo999.logvà bạn muốn thay đổi chúng thành bar000.logthông qua bar999.log. Với mvbạn phải làm mv foo000.log bar000.log, mv foo001 bar001.logvv hoặc nếu không viết một kịch bản. Với renamebạn chỉ cần làm rename foo bar foo*.logvà voila, một ngàn tệp được thay đổi ngay lập tức! Tuyệt đấy. Kiểm tra man renametrang một lần nữa để biết chi tiết.


2

mv

Đó là một dòng lệnh cơ bản được thiết kế để làm một việc và làm tốt điều đó (triết lý Unix): di chuyển tệp (s) hoặc directorie (s) .

Bạn có thể hack STDOUT& STDINđể sửa đổi khi đang bay chuỗi đích, nhưng đó không phải là một hack thông minh

đổi tên (Perl's one)

cảnh báo Có những công cụ khác có cùng tên có thể hoặc không thể làm điều này, vì vậy hãy cẩn thận.

Khi mọi người nói về rename, chúng ta nghĩ về cái này, không phải cái ELFkia, kém mạnh mẽ hơn (ma thuật?).

Nó không cơ bản, nó là Perl. Bạn có thể vượt qua một số chức năng của Perl bên trong và nó cực kỳ mạnh mẽ.

Xem xét ví dụ này:

Bạn muốn đổi tên một loạt các tập tin như

foobar_1.txt
foobar_2.txt
foobar_3.txt

Bạn có thể thêm các số không vào các chữ số sprintf()như thế này (sử dụng regex, heh, đó là Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Bây giờ bạn có :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Không thực sự là một lệnh cơ bản, phải không?

không thực sự được thiết kế để di chuyển dir (s) , nhưng nó có thể làm điều đó:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

Các tập tin di chuyển

/tmp/file

Một số mã chúng tôi thấy trên *.stackexchange.*các trang web

nhập mô tả hình ảnh ở đây

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

Đó không phải là con đường để đi , đó là lỗi đơn giản, chỉ để giải thích tại sao sử dụng đúng công cụ vào đúng thời điểm


+1 cho sprintfing với đổi tên
Archemar

-1

mv di chuyển hoặc đổi tên các tập tin và thư mục và sẽ sao lưu chúng; đổi tên chỉ đổi tên tập tin.

mv có nhiều khả năng và tùy chọn hơn. Nhìn vào các công tắc trong các trang man cho từng người để thấy sự khác biệt về khả năng. Hãy xem người dùng trong Ubuntu 18.04LTS (số dặm của bạn có thể thay đổi tùy theo phiên bản của từng gói):

tùy chọn mv (bỏ qua trợ giúp và phiên bản)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

đổi tên tùy chọn (bỏ qua trợ giúp và phiên bản)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            

3
Xác định 'mạnh hơn'. Mv có hỗ trợ regex như đổi tên không?
Gilles Quenot

Như người hỏi đã nêu, không.
K7AAY

2
Wow, thật là một cuộc tranh cãi
Gilles Quenot

1
Cung cấp tín dụng khi tín dụng đến hạn.
K7AAY
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.