Đổi tên hàng loạt, phiên bản * nix


11

Tôi đang tìm cách đổi tên một số lượng lớn các tệp có cùng tên, giống như câu hỏi này (một câu hỏi liên quan đến Windows) ngoại trừ việc tôi đang sử dụng * nix (Ubuntu và FreeBSD, riêng). Chỉ cần tổng hợp, trong khi sử dụng trình bao (Bash, CSH, v.v.), làm cách nào để đổi tên hàng loạt một số tệp sao cho các tệp sau:

Beethoven - Fur Elise.mp3
Beethoven - Moonlight Sonata.mp3
Beethoven - Ode to Joy.mp3
Beethoven - Rage Over the Lost Penny.mp3

Sẽ được đổi tên như thế này?

Fur Elise.mp3
Moonlight Sonata.mp3
Ode to Joy.mp3
Rage Over the Lost Penny.mp3

Lý do tôi muốn làm điều này là vì bộ sưu tập các tệp này sẽ nằm trong một thư mục có tên "Beethoven" (tức là tiền tố của tên tệp) và có thông tin này trên tên tệp sẽ là dự phòng.

Câu trả lời:


12

Tiện ích đổi tên sẽ làm những gì bạn muốn.

Chỉ dùng rename 's/Beethoven\ -\ //g' *.mp3


Bạn có thể vui lòng chỉnh sửa để cung cấp một liên kết đến tiện ích, hoặc nó là tiêu chuẩn trong cả hai bản phân phối được đề cập (Ubuntu và FreeBSD)?
Chris W. Rea

1
Nó đi kèm với Perl. Debian sử dụng nó làm lệnh đổi tên, vì vậy tôi nghi ngờ Ubuntu cũng vậy. Có một lệnh 'đổi tên' khác là vô giá trị, vì vậy hãy kiểm tra trang man.
derobert

wow, cú pháp đổi tên trông rất giống với vim thay thế: D
Dzung Nguyen

cổng trong / usr / cổng / sysutils / đổi tên hoạt động hoàn hảo trong FreeBSD
Josh W.

10

Giống như rất nhiều thứ với Linux / Unix, có nhiều hơn một cách để làm điều đó!

Một số có thể sử dụng mmv (khối lượng mv).

Lệnh đổi tên hoặc prename đi kèm với một số gói Perl (Ubuntu và Debian mới hơn) cũng có thể làm điều này.

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Lưu ý rằng công cụ đổi tên trên Fedora 10 không giống với chương trình này và hoạt động khác nhau. Nó là một phần của gói khác, produc-linux-ng và có thể tìm thấy ở đây .

Tôi thường chỉ đi đến cái vỏ để thoát khỏi thói quen (sau khi tất cả các công cụ như vậy không luôn tồn tại).

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

Điều này sẽ tạo thư mục Beethoven, sau đó di chuyển tệp đến thư mục / tên tệp đó, trong đó tên tệp có "Beethoven -" được thay thế bằng không có gì.

Như một bài kiểm tra, trước:

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

Sau:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

Hãy thử giải pháp này, được thực hiện bằng cách sử dụng kết hợp grep và đổi tên. Điều này giả sử bạn có cả đống thư mục mà bạn cần đổi tên. Nếu chỉ có một vài, tôi sẽ sử dụng phương pháp thủ công, với mẫu "Nghệ sĩ -" được mã hóa cho mỗi mẫu.

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

Giải thích về tìm :
Việc tìm lệnh tìm tất cả các tập tin với .mp3 mở rộng trong hệ thống phân cấp tập tin hiện nay, và kêu gọi đối số truyền cho exec cho mỗi. Lưu ý rằng trong -exec , {} đề cập đến đối số được truyền bởi find (đường dẫn tệp + tên). Việc \;đảm bảo ;được thông qua để đổi tên và thay vì chỉ ra kết thúc của lệnh find .

Lệnh được đưa ra ở trên có công tắc -n (không có hành động); do đó nó sẽ chỉ cho bạn biết điều gì sẽ xảy ra nếu bạn chạy nó. Tôi khuyên bạn nên chạy lệnh này mà không có công tắc -n chỉ sau khi bạn chạy nó một lần và hài lòng với kết quả được đề xuất.

Bây giờ cho regrec.

  • ^ khớp bắt đầu của chuỗi.
  • $ khớp với phần cuối của chuỗi.
  • . phù hợp với bất kỳ nhân vật.
  • *có nghĩa là không hoặc nhiều hơn các cấu trúc tiền xử lý. ví dụ .*có nghĩa là không hoặc nhiều ký tự.
  • \s là viết tắt của bất kỳ nhân vật không gian.
  • \S là viết tắt của bất kỳ nhân vật phi không gian.
  • Bất cứ điều gì trong vòng ()bị bắt và được phản ánh như $1, $2, tùy thuộc vào vị trí của nó.

Các regrec:

  • Tìm kiếm một cấu trúc thư mục tùy chọn khi bắt đầu, nắm bắt điều này trong $ 1: (.*/)
  • Bỏ qua mọi thứ cho đến khi " -":.*-
  • Nắm bắt phần còn lại của chuỗi, ngoại trừ khoảng trắng ở đầu và cuối, trong $ 2: (.*)
  • Viết lại tệp dưới dạng $ 1 $ 2, phải là "/path/to/file/""filename.mp3"

Đây là lần chạy thử của tôi:

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Regapi là một công việc khó khăn và tôi đã viết sai rất nhiều, vì vậy tôi hoan nghênh mọi ý kiến ​​đóng góp về sự thiếu công đức của việc này. Tôi biết tôi đã tìm thấy khá nhiều thử nghiệm này.


1

Tôi đã kết hợp một chương trình Java dòng lệnh để đổi tên các tệp (và thư mục) một cách dễ dàng, đặc biệt là cho kịch bản. Nó là nguồn mở và miễn phí, vì vậy bạn có thể sửa đổi nó thành nội dung trái tim của bạn:

Đổi tênWand
http://renamewand.sourceforge.net/

Một số ví dụ sử dụng có liên quan:

Di chuyển các tệp của biểu mẫu "<a> - <b>"vào thư mục tương ứng của họ "<a>":

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

Sắp xếp các tệp theo thời gian sửa đổi lần cuối và đổi tên chúng với số có 3 chữ số:

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

Sắp xếp lại các phần của tên tệp và trường hợp thay đổi:

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv Công cụ đổi tên zsh là rất tốt.

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

Thêm ghi chú ở đây ...


0

Đối với người đứng đầu Penguin, việc này dễ dàng được thực hiện trong tập lệnh shell hoặc tập lệnh AWK. Đối với chúng tôi chỉ là phàm nhân, bạn có thể muốn thử Midnight Commander. Đó là trên hầu hết các bản phân phối linux, từ một dấu nhắc kiểu shell mc -a. Bạn có thể đổi tên tập tin bằng cách sử dụng biểu thức thông thường. Tôi đã sử dụng bài viết tại GeekStuff http: //www.thegeek ware.com/2009/06/how-to-rename-files-in-group/ để giúp tôi.


0

Đây là một ví dụ dòng lệnh đơn giản. Tôi có từ "trắng" ở giữa tên của một loạt các tập tin png. Tôi muốn lấy nó ra và chỉ để lại một dấu gạch dưới. Điều này đã lừa

for i in *.png; do mv "$i" "${i/white/}"; done

0

Sử dụng vidir và sau đó sử dụng các tính năng biên tập của bạn để áp dụng mô hình đổi tên.

TÊN

vidir - chỉnh sửa thư mục

TÓM TẮC

vidir [--verbose] [thư mục | tệp | -] ...

SỰ MIÊU TẢ

vidir cho phép chỉnh sửa nội dung của một thư mục trong trình soạn thảo văn bản. Nếu không có thư mục được chỉ định, thư mục hiện tại được chỉnh sửa.

Khi chỉnh sửa một thư mục, mỗi mục trong thư mục sẽ xuất hiện trên dòng được đánh số riêng. Những con số này là cách vidir theo dõi những mặt hàng được thay đổi. Xóa các dòng để xóa tệp khỏi thư mục hoặc chỉnh sửa tên tệp để đổi tên tệp. Bạn cũng có thể chuyển đổi các cặp số để hoán đổi tên tập tin.

Lưu ý rằng nếu "-" được chỉ định làm thư mục để chỉnh sửa, nó sẽ đọc danh sách tên tệp từ stdin và hiển thị các tên để chỉnh sửa. Ngoài ra, một danh sách các tập tin có thể được chỉ định trên dòng lệnh.

VÍ DỤ

vidir vidir * .jpeg Sử dụng điển hình.

tìm | vidir - Chỉnh sửa nội dung thư mục con quá. Để xóa thư mục con, hãy xóa tất cả nội dung của chúng và chính thư mục con trong trình chỉnh sửa.

tìm -type f | vidir - Chỉnh sửa tất cả các tệp trong thư mục và thư mục con hiện tại.

TÁC GIẢ

Joey Hess 2006-2010

Sửa đổi bởi Magnus Woldrich 2011

BẢN QUYỀN

Bản quyền 2006-2011 của vidir "AUTHOR" như được liệt kê ở trên.

Được cấp phép theo GPL GNU.


0

Trên một * nix không có perl renamecó sẵn

Trên một số * nix không có đổi tên có sẵn, do đó, cần phải đổi tên bằng một số phương pháp khác. Một vài năm trước tôi đã đề nghị zmvở đây, trong khi tuyệt vời, không nhất thiết phải có sẵn.

Sử dụng nội trang và sed, chúng ta có thể nhanh chóng tạo ra một tập lệnh shell để thực hiện điều này, điều này mang lại cho chúng ta cú pháp rất giống với tập lệnh đổi tên perl, trong khi thiếu một số xử lý lỗi, nó sẽ hoàn thành công việc.

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

Sử dụng

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Nói rằng chúng tôi cũng muốn tạo thư mục đích ...

mvkhông tạo các thư mục mà chúng tôi không thể sử dụng sedrenamenhư ở đây, nhưng đó là một thay đổi khá nhỏ, vì vậy tôi cho rằng cũng rất tốt nếu bao gồm nó.

Chúng ta cần một hàm tiện ích, abspath(hoặc đường dẫn tuyệt đối) để chúng ta có thể tạo (các) thư mục đích cho mẫu sed / đổi tên bao gồm cấu trúc thư mục mới.

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

Điều này sẽ đảm bảo chúng tôi biết tên của các thư mục đích của chúng tôi. Khi chúng tôi đổi tên, chúng tôi sẽ cần sử dụng nó trên tên tệp mục tiêu.

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

Đây là tập lệnh nhận biết thư mục đầy đủ ...

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

Tất nhiên, nó vẫn hoạt động khi chúng ta không có các thư mục đích cụ thể.

Nếu chúng tôi muốn đặt tất cả các bài hát vào một thư mục, ./Beethoven/chúng tôi có thể làm điều này:

Sử dụng

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

Vòng thưởng ...

Sử dụng tập lệnh này để di chuyển tệp từ thư mục vào một thư mục:

Giả sử chúng tôi muốn thu thập tất cả các tệp phù hợp và đặt chúng vào thư mục hiện tại, chúng tôi có thể làm điều đó:

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Lưu ý về mẫu sed regex

Các quy tắc mẫu sed thông thường được áp dụng trong tập lệnh này, các mẫu này không phải là PCRE (Biểu thức chính quy tương thích Perl). Bạn có thể sử dụng cú pháp biểu thức chính quy mở rộng, sử dụng sed -rhoặc sed -E tùy thuộc vào nền tảng của bạn.

Xem tuân thủ POSIX man re_formatđể biết mô tả đầy đủ về các mẫu regrec cơ bản và mở rộng.

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.