Unix: Các tệp bắt đầu bằng dấu gạch ngang, -


19

Ok, tôi có một loạt các tệp bắt đầu bằng dấu gạch ngang, -. Điều đó không tốt lắm ... và tôi muốn đổi tên chúng. Trong trường hợp cụ thể của tôi, tôi chỉ muốn đặt một nhân vật trước mặt họ.

Tôi đã tìm thấy dòng sau đây sẽ hoạt động, nhưng vì nó gạch ngang nên nó không:

for file in -N*.ext; do mv $file x$file; done

Nếu tôi đặt echotrước mặt mvtôi sẽ nhận được một loạt

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

Điều này là chính xác, ngoại trừ tất nhiên nó sẽ nghĩ tên tệp đầu tiên là tùy chọn. Vì vậy, khi tôi gỡ bỏ echovà chạy nó, tôi chỉ nhận được một loạt

mv: illegal option -- N

Tôi đã cố gắng thay đổi nó thành

for file in -N*.ext; do mv "$file" "x$file"; done

nhưng dường như các trích dẫn bị bỏ qua Đã thử sử dụng dấu ngoặc đơn, nhưng sau đó biến không được mở rộng ... Tôi phải làm gì ở đây?

Cập nhật: Bây giờ tôi cũng đã cố gắng trích dẫn các trích dẫn. Như thế này:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

Và khi tôi lặp lại, nó có vẻ đúng, nhưng khi tôi thực sự chạy nó, tôi chỉ nhận được

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

Tôi không biết làm thế nào để làm điều này bây giờ ... thở dài


Câu trả lời:


28

Bạn cần sử dụng từ khóa --để nói với lệnh mv rằng các đối số không được hiểu là các tùy chọn. Đồng hồ đeo tay:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

Sử dụng -- sau khi tất cả các tùy chọn trên dòng lệnh. Ví dụ: nếu bạn đang cố gắng sử dụng -itùy chọn cho mv , nó sẽ đi trước -- :

mv -i -- -filename-begins-with-dash newfilename

6
Aaah. Không nghĩ gì về điều đó cả. Trong thời gian đó tôi phát hiện ra rằng tôi cũng có thể dán ./trước tên tệp, nó sẽ hoạt động. Nhưng đây tất nhiên là một lựa chọn thậm chí gọn gàng hơn :)
Svish

@Svish: thật công bằng, tôi đã không nghĩ đến việc chuẩn bị tên tệp bằng ./một trong hai. nhưng bạn đã đúng, điều đó cũng hiệu quả với tình huống này.
quack quixote

7
Lưu ý rằng --ý nghĩa không xử lý các đối số tiếp theo vì các tùy chọn là một quy ước và không được tất cả các chương trình tôn trọng. Một số sử dụng một mình -cho điều đó, và một số không chấp nhận bất cứ điều gì cho mục đích đó. Vì vậy, chuẩn ./bị là đáng lưu ý.
dmckee

@dmckee là đúng; --như một đối số đặc biệt là một phần mở rộng GNU, nhưng nó được đề cập trong hướng dẫn POSIX. xem phần 12.2, hướng dẫn 10: opengroup.org/onlinepub/9699919799/basingefs/V1_chap12.html ... điều này có nghĩa là bạn có thể mong đợi hầu hết các tiện ích POSIX và GNU tôn trọng quy ước, nhưng những người khác thì không.
quack quixote

6

Một kỹ thuật khác là bao gồm thư mục mẹ với tên tệp ...

Để đổi tên tập tin '-file-to-đổi tên' thành 'tập tin để đổi tên' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

Cảm ơn bạn @Skippy le Grand Gourou. Xác nhận rằng ./-file-to-rename hoạt động cùng mvrmnhư trong ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

1
Hoặc tốt hơn, như đã được đề cập trong các bình luận để sử dụng câu trả lời của quixote, sử dụng ./.
Skippy le Grand Gourou
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.