Làm thế nào để gửi văn bản hàng loạt vào tên tập tin?


44

Hãy nói rằng tôi có một thư mục chứa đầy đủ các .mdtập tin được đặt tên khác nhau. Hãy nói rằng tôi muốn thêm "văn bản" vào trước mỗi tên tệp. Vì vậy, ví dụ: tập tin a.md, b.mdc.mdsẽ trở thành test - a.md, test - b.mdtest - c.md.

Làm thế nào tôi có thể thực hiện điều này thông qua dòng lệnh?

Câu trả lời:


60

Một lớp lót có thể dễ dàng gõ thẳng từ thiết bị đầu cuối:

for f in *.md; do mv "$f" "test - $f"; done

Hoặc viết lại trên các dòng riêng biệt thay vì sử dụng dấu chấm phẩy:

for f in *.md
do
    mv "$f" "test - $f"
done

Triển lãm

Cú pháp của for(trong sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Ở đây, chúng tôi NAMEfWORDStất cả các tệp trong thư mục hiện tại phù hợp *.md. Vì vậy, biến $fsẽ được thay thế với mỗi tệp phù hợp *.md.

Vì vậy a.md:

mv "$f" "test - $f"

trở thành

mv "a.md" "test - a.md"

Các trích dẫn rất quan trọng vì mỗi tên tệp $fcó thể chứa khoảng trắng. Nếu không mvsẽ nghĩ mỗi từ là một tập tin riêng biệt. Ví dụ: nếu không có dấu ngoặc kép và có một tệp được gọi Foo Bar.md, nó sẽ dịch là:

mv Foo Bar.md test - Foo Bar.md

mà sẽ không làm việc như ý định. Nhưng bằng cách gói $ftrong dấu ngoặc kép, nó có ý nghĩa:

mv "Foo Bar.md" "test - Foo Bar.md"

Lưu ý cú pháp của for, bạn cũng có thể đổi tên một tập hợp con của tất cả các *.mdtệp bằng cách đặt tên rõ ràng cho từng tệp:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Hoặc sử dụng mở rộng vỏ:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

Đây chính xác là những gì tôi cần để xem. Cảm ơn!
Ryan

11

Nếu bạn có prename...

prename 's/^/test - /' *.md

Sử dụng các lệnh shell thông thường:

for file in *.md; do
    mv "$file" "test - $file"
done

Làm thế nào để tôi có được prename?
Gaʀʀʏ

Có vẻ như được cài đặt sẵn cho tôi trên Ubuntu 16.04 LTS. Bạn đã thử trình quản lý gói của bạn (ví dụ., sudo apt-get install)?
Orion751

5

mmv1 , 2 cũng là một công cụ rất hay cho một nhiệm vụ như vậy, áp dụng cho công việc hiện tại, nó sẽ là

mmv '*.md' 'test - #1.md'

Tất nhiên, nếu bạn chỉ muốn thêm "test -" vào a.md, b.md và c.md, chứ không phải a1.md, đại loại như

mmv '?.md' 'test - #1.md'

sẽ thích hợp hơn

Tôi thực sự có thể đề nghị nó, đặc biệt là nếu bạn có nhiều vấn đề như vậy.

Nếu bạn đang tìm kiếm một giao diện đồ họa, hãy thử gprename .


5

Thay vì sử dụng vòng lặp for, sẽ thất bại trên các khoảng trắng trừ khi bạn xác định lại biến IFS, tôi khuyên bạn nên sử dụng vòng lặp while kết hợp với find. Dưới đây sẽ hoạt động khi chạy từ cùng thư mục với các tệp

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

dòng "basename" nằm trong đó để find sẽ chỉ in tên tệp - không có các thành phần đường dẫn sẽ làm cho hoạt động đổi tên bị phá vỡ.


2

Tôi biết rằng nó thực sự muộn, nhưng nếu bất cứ ai khác đang tìm kiếm một cái gì đó như thế này, thì điều này làm việc cho tôi:

rename '' 'name -' *.md

1
đơn giản và dễ hiểu
user13743

0

Nếu bạn có zshsẵn, bạn có thể sử dụng zmv:

autoload zmv
zmv -w '*' 'test - $1'

Bạn có thể kiểm tra lệnh bằng:

zmv -wn '*' 'test - $1'
  • -n có nghĩa là chạy khô, tức là chỉ hiển thị những gì sẽ xảy ra.
  • -w ngầm đặt dấu ngoặc quanh các ký tự đại diện, làm cho phản hồi hoạt động.

0

Trong bash, thêm "Chuẩn bị văn bản -" cho tất cả các tệp trong thư mục:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

Đây là một cách viết siêu dàifor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby
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.