Thêm phần mở rộng tệp vào tệp có bash


94

Cách tốt để thêm phần mở rộng tệp ".jpg" vào các tệp không có phần mở rộng với bash là gì?


3
mv "${file}" "${file}.jpg"?
onteria_

2
theo quan điểm của bạn, "tệp không có phần mở rộng" là gì? Nó có phải là một tập tin không có dấu chấm trong tên?
glenn jackman

Câu trả lời:


118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
thứ hai là hoàn hảo để đổi tên các tệp không có phần mở rộng! cảm ơn!
anon58192932

2
thứ hai thêm tiện ích mở rộng trên tất cả các tệp, không chỉ những tệp không có tiện ích mở rộng
Jeff

5
cũng giống như một lưu ý "${f%.jpg}"là thao tác chuỗi shell bash. `$ {string% substring}` Xóa kết quả khớp ngắn nhất của chuỗi con $ từ phía sau của $ string.
Jichao

Cảnh báo: Nếu bạn có một thư mục có phần mở rộng hỗn hợp, hãy biết rằng phần mở rộng ở trên sẽ thêm .jpgvào các tệp bình thường.
sachinruk

61

Bạn có thể sử dụng đổi tên:

rename 's/(.*)/$1.jpg/' *

3
bạn đang sử dụng phiên bản đổi tên nào? Của tôi có các lập luận khác nhau:rename from to file...
B Johnson

1
đổi tên được bao gồm với perl, đó là phiên bản 5.10.1.
Kim Stebel

3
Điều này hoạt động tốt với việc đổi tên có trong Ubuntu (và vì vậy tôi đoán tất cả các bản phân phối dựa trên Debian), ít dài dòng hơn câu trả lời của jm666.
Roger Heathcote

28

Một cách khác - không có vòng lặp

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

Phá vỡ:

  • tìm tất cả các tệp không có phần mở rộng
  • kiểm tra loại tệp
  • chỉ lọc ra các tệp JPG
  • xóa thông tin loại tệp
  • xargs chạy "mv" cho mỗi tệp

lệnh trên là để chạy khô , sau nó, bạn nên xóa "echo" trước mv

CHỈNH SỬA Một số người đề xuất rằng ở đây là cần thiết "Gói đối số đường dẫn trong dấu ngoặc kép; tránh tách đối số trên đường dẫn có dấu cách" .

Thông thường, khuyến nghị này là đúng, trong trường hợp này thì không. Bởi vì, ở đây cái %được thay thế không phải bằng cách mở rộng shell mà bằng phần xargsbên trong (trực tiếp), vì vậy cái %sẽ được thay thế một cách chính xác ngay cả với khoảng trắng trong tên tệp.

Bản demo đơn giản:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

Bạn có thể đặt điều này vào một vòng lặp và xargs này là không cần thiết. Tôi thích câu trả lời của Ryan hơn trong tình huống này.
Lucius

1
@Lucius - btw, câu hỏi muốn "extensionless" file - vì vậy Ryan nên tìm chỉ những ...
jm666

@ jm666 này! làm cách nào để sửa đổi đoạn mã của bạn để đổi tên tất cả các tệp không có phần mở rộng trong một thư mục thành phần mở rộng tương ứng của chúng. (Tôi phát hiện phần mở rộng đúng bằng tập tin -b lệnh $ filename.)
Soumyajit

24

Đơn giản, cd vào thư mục chứa tệp của bạn và:

for f in *;do mv $f $f.jpg;done

Vì một số lý do, điều này phù hợp với tôi, nhưng giải pháp của Seth với dấu ngoặc kép thì không. (OSX Mountain Lion bash)
delrocco

4
Sẽ tốt hơn nếu được sử dụng for f in *;do mv "$f" "$f".jpg;doneđể hỗ trợ khoảng trắng trong tên tệp.
Hritik

Cảm ơn vì giải pháp đơn giản và thanh lịch này - Tôi đã điền vào câu trả lời này nhiều lần, nhưng dường như không thể ghi nhớ nó. #dejavu
Tim Andersen

15

chạy khô:

 rename -n s/$/.jpg/ *

đổi tên thực tế:

 rename s/$/.jpg/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

1

Trong trường hợp của tôi, tôi không biết loại tệp vì vậy tôi đã sử dụng lệnh mv với sự trợ giúp của lệnh tệp để kiểm tra và có thể tìm thấy loại tệp. Giải pháp này có thể không hoàn hảo cho tất cả các tệp vì lệnh tệp có thể không nhận dạng được loại tệp nhưng nó hầu như hoạt động tốt đối với tôi.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

Công dụng của awk là loại bỏ từ thứ hai của chuỗi được trả về từ tệp lệnh thực sự là phần mở rộng.


tự động xử lý jpg và png. đã sử dụng nó và hoạt động - cảm ơn rất nhiều! Hiện chỉ có phần mở rộng là CHỮ HOA. vấn đề nhỏ tuy nhiên :)
krivar

0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename

--dry-run-akhông có sẵn trong phiên bản của tôi rename. Nếu điều này là cụ thể cho một số kiến ​​trúc, nó nên được chỉ định.
Fernando César

0

Bạn có thể sử dụng di chuyển nhiều tệp . Tôi là người bảo trì dự án này. Cú pháp rất đơn giản.

mmf files*

Nó sẽ mở $ EDITOR của bạn với tất cả các tên tệp hoặc vim theo mặc định và bạn có thể chỉ cần đánh dấu phần cuối của tất cả các tên tệp bằng cách sử dụng Ctrl + v + G trong vim, lưu tệp, thoát và nó, tất cả các tệp của bạn được đổi tên


-2

Ryan Li

Cú pháp đúng để thêm phần mở rộng tệp vào nhiều tệp trong một thư mục không có phần mở rộng tệp là

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
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.