lệnh tìm / đổi tên không hoạt động


7

Tôi đang sử dụng Linux Slackware 14.0, bash 4.2. Giả sử, tôi có 2 tệp trong thư mục:

bash-4.2$ ls
1.txt  2.txt

Tôi muốn đổi tên chúng thành .svg. Câu trả lời này được chấp nhận và nâng cao, vì vậy tôi nghĩ rằng nó phải hoạt động. Ông đã sử dụng lệnh này:

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;

Vì vậy, tôi đã viết lệnh tương tự, nhưng nó đã in một lỗi:

bash-4.2$ find . -name "*.txt" -exec rename -v 's/\.txt$/\.svg/i' {} \;
rename: not enough arguments

Khi tôi chỉ muốn in các tập tin, nó hoạt động:

bash-4.2$ find . -name "*.txt" -print
./1.txt
./2.txt

Tôi biết rằng tôi có thể đổi tên bằng cách tiếp cận đơn giản hơn:

bash-4.2$ rename .txt .svg ./*.txt
bash-4.2$ ls
1.svg  2.svg

Nhưng tại sao lệnh từ câu trả lời đó không hiệu quả với tôi?


1
Có hai cách thực hiện đổi tên hoàn toàn khác nhau trên Linux: một từ perl(mà câu trả lời giả định) và một từ linux-linux (mà bạn có).
Stéphane Chazelas

@StephaneChazelas Làm cách nào để chuyển đổi câu trả lời đó sang sử dụng triển khai của tôi?
dùng4035

4
find . -name '*.txt' -exec rename .txt .svg {} +
Stéphane Chazelas

@StephaneChazelas Đã làm việc, thx. Tôi có thể đọc tài liệu ở đâu, giải thích cú pháp bạn đã sử dụng: '{} +'?
dùng4035

info --index-search=-exec find
Stéphane Chazelas

Câu trả lời:


10

Có hai lệnh được gọi renametrên các bản phân phối Linux. Có một trong các tiện ích Linux cơ bản , được sử dụng như thế này:

rename SUBSTRING REPLACEMENT FILE...

Lệnh này thay thế cho lần xuất hiện đầu tiên của SUBSTRING bằng cách THAY THẾ trong mỗi tệp được chỉ định. Nó chỉ hỗ trợ các chuỗi đơn giản, không phải ký tự đại diện hoặc biểu thức chính quy. Trên Debian và các dẫn xuất (Ubuntu, Mint, v.v.), lệnh này được gọi rename.ul. Trên các bản phân phối Linux khác, nó được gọi là rename.

Ngoài ra còn có một tập lệnh perl được gọirename là được sử dụng như thế này:

rename 'PERL CODE' FILE...

Một dạng phổ biến của mã Perl là rename 's/REGEXP/REPLACEMENT/' FILE..., thay thế lần xuất hiện đầu tiên của REGEXP bằng cách THAY THẾ trong mỗi tên tệp ( s/REGEXP/REPLACEMENT/gthay thế tất cả các lần xuất hiện).

Tác giả của câu hỏi mà bạn thấy chỉ ra rằng anh ta đang chạy Ubuntu, do đó anh ta đã chấp nhận câu trả lời này bằng cách sử dụng renamelệnh được tìm thấy trên Ubuntu.

Tương tự cho renamelệnh tiêu chuẩn là

find . -name "*.txt" -exec rename .txt .svg {} \;

Với bash 4, bạn có thể sử dụng **mẫu ký tự đại diện sau khi đặt globstartùy chọn khớp các tệp trong thư mục con mà không cần sử dụng find.

shopt -s globstar
rename .txt .svg **/*.txt

Coi chừng renamelệnh này hoạt động trên chuỗi đầu tiên, vì vậy nếu bạn có một tệp được gọi hello.txt.world.txt, nó sẽ được đổi tên thành hello.svg.world.txt.

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.