Đổi tên tệp trong thư mục cục bộ thêm tiền tố hoặc hậu tố


12

Tôi có nhiều tệp trong một thư mục và tôi muốn thêm tiền tố hoặc hậu tố (không phải cả hai ) cho chúng. Tôi đã kiểm tra ở đây và phát hiện ra tôi có thể sử dụng

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

để thêm tiền tố vào tất cả các tệp kết thúc bằng .jpg(và nếu tôi loại bỏ .jpg, nó sẽ thêm tiền tố vào tất cả các tệp trong thư mục hiện tại).

Tuy nhiên, tôi muốn có thể

  • Thêm một sufix (nghĩa là đổi tên filename.extthành filename.whatever.ext),
  • Kiểm tra xem tiền tố hoặc hậu tố đã có và sau đó bỏ qua,
  • Tạo một bí danh chấp nhận các đối số như addprefix whatever *.exthoặcaddsufix whatever *.*

Câu trả lời:


10

Nếu bạn đang sử dụng bash, thì đây một lót có thể làm điều đó cho bạn (giả sử bạn có các biến $prefix, $suffix$extensioncó sẵn)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Bạn có thể có kịch bản của bạn như thế này

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done

Điều đó gần như hoàn hảo! Sẽ thật hoàn hảo nếu nó (1) được kiểm tra nếu tiền tố hoặc hậu tố đã có sẵn (và sau đó bỏ qua) và (2) hoạt động trên các tệp không có phần mở rộng. Xin lỗi vì đã làm phiền quá nhiều ...
chàng người Brazil đó

Đối với (1) bạn có thể (tôi nghĩ, không được kiểm tra) thêm kiểm tra tiền tố bằng cách gói mv vào một if [ $f == $prefix* ]và bạn có thể thay đổi hậu tố với if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]xung quanh các lệnh mv vài trong adduffix. Đối với (2) nó sẽ hoạt động trên các tệp không có phần mở rộng, trừ khi tôi là một lập trình viên khủng khiếp.
Aaron Okano

7

Có một lệnh Perlrename nên thực hiện các mẹo. Coi chừng: có một số lệnh khác nhau được gọi rename, vì vậy hãy chắc chắn rằng bạn đã có tập lệnh Perl mong muốn perlexprlà đối số của nó. Đây là renamelệnh được cung cấp bởi perlgói trên Debian và các công cụ phái sinh (Ubuntu, Mint, '), nhưng không phải trên các bản phân phối khác có thể có một tiện ích khác được gọi rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Như bạn có thể thấy, đó là idempotent - nó sẽ không thêm tiền tố nữa khi bạn gọi nó nhiều lần.

Nó hoạt động bằng cách thay thế bắt đầu (độ dài bằng không) của chuỗi ( ^) hoặc bắt đầu theo sau bởi một prefixchuỗi tùy chọn bằng prefix.

Tôi sẽ đóng gói cái này trong tập lệnh shell hoặc hàm shell như một bài tập cho bạn :)

Postfix khó hơn một chút, bởi vì bạn phải tìm ra phần nào của tên tệp tạo thành phần mở rộng ...


Đó là một câu trả lời hay, nhưng tôi đang tìm kiếm thứ gì đó phổ quát hơn; Đối với câu trả lời này, bạn cần có cả perl và cụ thể (hoặc tương đương) này rename. Và tôi biết hậu tố khó hơn một chút, nó không nằm trong câu hỏi được liên kết và tôi là người mới bắt đầu sử dụng linux, bash, shell script, perl và các biểu thức chính quy, vì vậy "khó hơn một chút" đối với tôi ! :)
chàng người Brazil đó

4

Với zsh :

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~là toán tử globalbing có nghĩa là ngoại trừ trong zsh.


1

Ví dụ đơn giản để thay đổi tiền tố và phần mở rộng của tất cả các hình ảnh trong thư mục hiện tại.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Nếu bạn muốn kiểm tra xem nó sẽ ảnh hưởng đến dữ liệu của bạn như thế nào trước khi thay đổi thì hãy thay thế mv bằng echo

đầu ra cho IMG_7993.JPG là EG_IMG_7993.jpg

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.