Đổi tên tập tin trong một thư mục thành số liên tiếp


230

Tôi muốn đổi tên các tập tin trong một thư mục thành các số liên tiếp. Dựa trên ngày tạo của các tập tin.

Ví dụ sadf.jpgđể 0001.jpg, wrjr3.jpgđến 0002.jpgvà như vậy, số lượng zero hàng đầu phụ thuộc vào tổng số tiền các tập tin (không cần cho zero thêm nếu không cần thiết).


Tôi đã xem stackoverflow.com/questions/880467/ , nhưng tôi không thể làm việc đó cho tôi.
Gnutt

1
Linux / Unix không lưu trữ ngày tạo.
Tạm dừng cho đến khi có thông báo mới.

1
l -1tr | đổi tên -v 's /.*/ $ của chúng tôi i; nếu {$ i = 1;} sprintf ( "% 04d.jpg", $ i ++) / e ($ i!)'
maXp

Câu trả lời:


313

Cố gắng sử dụng một vòng lặp letprintfcho phần đệm:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

sử dụng -icờ ngăn tự động ghi đè các tập tin hiện có.


4
Bạn cũng có thể làm printf -v new "%04d.jpg" ${a}để đưa giá trị vào biến. Và ((a++))hoạt động để tăng các biến. Ngoài ra, điều này không thực hiện theo thứ tự ngày tạo hoặc giảm thiểu phần đệm là những thứ mà OP chỉ định. Tuy nhiên, cần lưu ý rằng Linux / Unix không lưu trữ ngày tạo.
Tạm dừng cho đến khi có thông báo mới.

3
Cần gấp đôi trích dẫn bọc mv cho điều này để làm việc trong môi trường bash của tôi. mv "$ {i}" "$ {mới}"
Gary Thomann

2
Có thể chỉ là Cygwin (mặc dù hành vi đầu cuối của nó gần giống với shell Unix thông thường) nhưng dường như có vấn đề khi có khoảng trắng trong tên tệp.
Geesh_SO

2
Có lẽ cũng nên sử dụng mv -- "$i" "$new"để xử lý chính xác tên tệp nguồn bắt đầu bằng dấu gạch ngang; vì vậy, mvsẽ cố gắng phân tích tên tệp như là bộ sưu tập cờ.
Charles Duffy

2
Tôi đã mất khoảng 800 tập tin trong nháy mắt. Tôi nghĩ -inên được đưa vào câu trả lời và ghi chú nên được viết lại cho phù hợp. Điều đó sẽ an toàn hơn. :(
KrIsHnA

269

Vẻ đẹp trong một dòng:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

Bạn có thể thay đổi .extvới .png, .jpgvv


4
chú thích :), tôi đã sử dụng cái này trên git shell trên windows, hoạt động rất tốt! ^^
Mr.K

4
Công trình tuyệt vời. Vẻ đẹp trong một dòng. Tôi đã thêm ls -tr lấy các tập tin vào lần sửa đổi cuối cùng.
Ranjith Siji

32
thêm printf như thế này: ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; doneđể có số đệm bằng 0
Seweryn Niemiec

8
Cảnh báo: Bạn có thể muốn thêm -nvào lệnh mv để ngăn các tập tin ghi đè vô tình. Phát hiện ra điều này một cách khó khăn!
Ian Danforth

4
Tổng hợp một số ý tưởng tuyệt vời từ các nhận xét về câu trả lời này và các ý tưởng khác: ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done Kết quả: (1) được sắp xếp theo thứ tự sửa đổi, các tệp sau với các chỉ mục sau này; (2) bỏ qua các thư mục - và không đệ quy; (3) chỉ số miếng đệm; (4) duy trì mở rộng ban đầu.
Jorge

63

Tôi thích giải pháp của gauteh vì sự đơn giản của nó, nhưng nó có một nhược điểm quan trọng. Khi chạy trên hàng ngàn tệp, bạn có thể nhận được thông báo "danh sách đối số quá dài" ( nhiều hơn về điều này ) và thứ hai, tập lệnh có thể trở nên rất chậm. Trong trường hợp của tôi, chạy nó trên khoảng 36.000 tệp, tập lệnh đã di chuyển khoảng. một mục mỗi giây! Tôi không thực sự chắc chắn tại sao điều này xảy ra, nhưng quy tắc tôi nhận được từ các đồng nghiệp là " findlà bạn của bạn" .

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

Để đếm các mục và xây dựng lệnh, gawk đã được sử dụng. Lưu ý sự khác biệt chính, mặc dù. Theo mặc định, findtìm kiếm các tệp trong thư mục hiện tại và các thư mục con của nó, vì vậy hãy đảm bảo chỉ giới hạn tìm kiếm trên thư mục hiện tại, nếu cần thiết (sử dụng man findđể xem cách thức).


7
Tôi đã sửa đổi để sử dụng số hàng NRcho một lệnh ngắn hơn. gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
Apiwat Chantawibul

12
Lỗ hổng bảo mật lớn ở đây. Hãy suy nghĩ về nếu bạn có một tập tin được đặt tên $(rm -rf /).jpg.
Charles Duffy

Cảm ơn đã chỉ ra rằng Charles. Bạn có thể đề xuất một giải pháp an toàn?
beibei2

2
phá vỡ trong trường hợp tên tệp có khoảng trắng. Sử dụng dấu ngoặc kép quanh tên tệp nguồn. printf "mv \"% s \ "% 04d.jpg \ n", $ 0, a ++
baskin

1
Các forvòng lặp không được tham gia 1 giây cho mỗi tập tin, nói đúng. Phải mất một thời gian dài để lấy 36.000 tên tệp từ hệ thống tệp, sau đó lặp lại chúng một cách hợp lý nhanh chóng. Nhiều hệ thống tệp có vấn đề với các thư mục lớn, bất kể bạn chạy lệnh nào; nhưng thông thường, findsẽ nhanh hơn ký tự đại diện bởi vì nó phải tìm nạp và sắp xếp danh sách các tệp phù hợp.
tripleee

30

với lệnh "đổi tên"

rename -N 0001 -X 's/.*/$N/' *.jpg

hoặc là

rename -N 0001 's/.*/$N.jpg/' *.jpg

32
My rename(Linux Mint 13) không có -Ntùy chọn.
Luke H

Tôi có thể nâng cấp chỉ khi đề cập đến lệnh đổi tên, tôi chưa bao giờ nghe về nó
user907860

8
Tôi muốn biết nơi người ta nhận được lệnh đổi tên với tùy chọn -N. Ubuntu 14.04 của tôi không có nó.
Stephan Henningsen

1
Tôi yêu renamelệnh, nhưng tôi không bao giờ biết về -N! Cảm ơn!
Dan Lecocq

1
ít nhất ba công cụ khác nhau được gọi làrename . Liên kết được đăng bởi @Bostrot là một công cụ đổi tên khác và có vẻ như @RomanRhrnNesterov đã sử dụng công cụ đó. Gửi tới tất cả người dùng của renamePeder Stray và Larry Wall (gói perl-renametrên arch linux và gói renametrên debian / $Nperl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
ub

30

sử dụng giải pháp của Pero trên OSX yêu cầu một số sửa đổi. Tôi đã sử dụng:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

lưu ý: dấu gạch chéo ngược có ở đó để tiếp tục dòng

chỉnh sửa ngày 20 tháng 7 năm 2015: kết hợp phản hồi của @ klaustopher để trích dẫn \"%s\"đối số của mvlệnh để hỗ trợ tên tệp có khoảng trắng.


3
Giống như giải pháp của Pero, có những lỗ hổng bảo mật ở đây. Hãy suy nghĩ về nếu bạn có một tập tin được đặt tên $(rm -rf /).jpg.
Charles Duffy

Cảm ơn, điều này làm việc. Nhưng bạn nên trích dẫn đối số đầu tiên để mv. Nếu bạn có một tập tin có tên là some thing.jpgtập lệnh của bạn thất bại. Đây là những gì tôi đã sử dụng:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
klaustopher 18/07/2015

tôi có lẽ sẽ chỉ sử dụng -maxdepth 1để làm việc trên jpg trong thư mục hiện tại, vì nó an toàn hơn là xin lỗi.
Peter Perháč

Nếu bạn di chuyển ký tự ống dẫn đến cuối dòng trước đó, bạn không cần bất kỳ dấu gạch chéo ngược nào.
tripleee

bạn có thể sử dụng ls -1 *.jpgthay vì tìm, nếu không nó sẽ không được sắp xếp. Hoặc thêm a |sort|trước awk
JPT

28

Một bash một lớp rất đơn giản giữ các phần mở rộng ban đầu, thêm các số 0 đứng đầu và cũng hoạt động trong OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Phiên bản đơn giản của http://ubuntuforums.org/showthread.php?t=1355021


Chính xác những gì tôi đang tìm kiếm. Tôi thích rằng bạn có thể thiết lập chỉ số bắt đầu.
Jack Vial

2
Xin lưu ý điều này sẽ không giữ thứ tự ban đầu của các tập tin.
Roy Shilkrot

@RoyShilkrot Ý của bạn là gì » sẽ không giữ trật tự ban đầu «? Các quả cầu trong bash và các vỏ posix khác mở rộng theo thứ tự được sắp xếp theo ngôn ngữ của hệ thống. Tất nhiên, điều này không sắp xếp 9.exttrước đây 11.ext, nhưng các công cụ khác (như ls) sẽ không làm như vậy.
Socowi

11

Để làm việc trong mọi tình huống, hãy đặt \ "cho các tệp có khoảng trắng trong tên

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

3
Trong thực tế không bao gồm tất cả các tình huống. Một tên tệp chứa các trích dẫn bằng chữ có thể thoát ra một cách tầm thường - và vì bạn đang sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn, nên các mở rộng như $(rm -rf /)vẫn được tôn vinh.
Charles Duffy

11

Nếu bạn renamekhông hỗ trợ -N, bạn có thể làm một cái gì đó như thế này:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

Chỉnh sửa Để bắt đầu với một số đã cho, bạn có thể sử dụng mã (trông hơi xấu xí) bên dưới, chỉ cần thay 123 bằng số bạn muốn:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

Điều này liệt kê các tệp theo thứ tự thời gian tạo (mới nhất trước, thêm -r vào ls để sắp xếp ngược lại), sau đó gửi danh sách các tệp này để đổi tên. Đổi tên sử dụng mã perl trong regex để định dạng và bộ đếm tăng dần.

Tuy nhiên, nếu bạn đang xử lý ảnh JPEG bằng thông tin EXIF, tôi khuyên bạn nên exiftool

Đây là từ tài liệu exiftool , trong "Đổi tên ví dụ"

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.

Làm thế nào tôi có thể bắt đầu ở một số cụ thể bằng cách sử dụng rename?
tháng 1,

6

Trên OSX , cài đặt tập lệnh đổi tên từ Homebrew:

brew install rename

Sau đó, bạn có thể làm điều đó thực sự dễ dàng một cách nực cười:

rename -e 's/.*/$N.jpg/' *.jpg

Hoặc để thêm một tiền tố đẹp:

rename -e 's/.*/photo-$N.jpg/' *.jpg

3
Đó là một kịch bản tuyệt vời, và nó chỉ phụ thuộc vào Perl. brew chỉ hoạt động trên máy Mac, nhưng bạn có thể lấy nó từ github ( github.com/ap/rename ) và sử dụng nó trên Linux hoặc Windows.
Tim Danner

3
điều này không làm việc cho tôi. Tôi đã nhậnGlobal symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Anthony Chung

Là người dùng Mac, tôi vui mừng báo cáo rằng ứng dụng đổi tên được liên kết bởi @TimDanner là siêu di động, dễ dàng như tải xuống kho lưu trữ Zip, thả tiện ích đổi tên vào thư mục mà đường dẫn hồ sơ bash của tôi được đặt để xem , và nó hoạt động ngay lập tức. Tôi ngạc nhiên khi điều này không có sẵn trên MacPorts. Tôi thấy thật kỳ lạ khi tôi có một trang quản trị BSD cho Đổi tên (2) nhưng khi chạy đổi tên thì sẽ không có lệnh nào tồn tại. Đi hình.
adamlogan

2

Thực hiện theo lệnh đổi tên tất cả các tệp thành chuỗi và cả phần mở rộng chữ thường:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *

1

Tôi đã có một vấn đề tương tự và đã viết một kịch bản shell cho lý do đó. Tôi đã quyết định đăng nó bất kể nhiều câu trả lời hay đã được đăng bởi vì tôi nghĩ nó có thể hữu ích cho ai đó. Hãy cải thiện nó!

số

@Gnutt Hành vi bạn muốn có thể đạt được bằng cách nhập như sau:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

Nếu tùy chọn -r bị bỏ qua, việc gia công sẽ chỉ được mô phỏng (Nên hữu ích để thử nghiệm).

Ume L mô tả độ dài của số mục tiêu (sẽ được điền vào các số 0 đứng đầu) cũng có thể thêm tiền tố / hậu tố với các tùy chọn -p <prefix> -s <suffix> .

Trong trường hợp ai đó muốn các tệp được sắp xếp bằng số trước khi chúng được đánh số, chỉ cần xóa -o modtimetùy chọn.


1
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done

1

Giả sử chúng ta có các tệp này trong một thư mục, được liệt kê theo thứ tự tạo, tệp đầu tiên là tệp cũ nhất:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

sau đó ls -1crxuất ra chính xác danh sách trên. Sau đó bạn có thể sử dụng rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

đầu ra nào

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

Việc cảnh báo sử dụng giá trị chưa được khởi tạo [[]]] được hiển thị cho các tệp mà không có phần mở rộng; bạn có thể bỏ qua nó

Xóa -nkhỏi renamelệnh để thực sự áp dụng việc đổi tên.

Câu trả lời này được lấy cảm hứng từ câu trả lời của Luke vào tháng 4 năm 2014 . Nó bỏ qua yêu cầu của Gnutt về việc đặt số lượng số 0 đứng đầu tùy thuộc vào tổng số lượng tệp.


Đây là câu trả lời hữu ích nhất ở đây đối với tôi, chủ yếu là vì tôi muốn chạy khô op trước khi nó chạy, và cũng vì tôi có thể điều chỉnh thứ tự bằng cách thay đổi theo ls -1tUthời gian tạo. Nó cũng cần renamecài đặt, cái mà tôi không có.
antonyh

1

Một lần nữa sử dụng giải pháp của Pero với một chút sửa đổi, bởi vì find sẽ đi qua cây thư mục trong các mục thứ tự được lưu trữ trong các mục nhập thư mục. Điều này sẽ (hầu hết) nhất quán từ chạy đến chạy, trên cùng một máy và về cơ bản sẽ là "thứ tự tạo tệp / thư mục" nếu không có xóa.

Tuy nhiên, trong một số trường hợp, bạn cần nhận được một số thứ tự hợp lý, giả sử, theo tên, được sử dụng trong ví dụ này.

find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command 

3
KHÔNG sử dụng cái này. Chuyển hướng đến bash như thế này là một rủi ro bảo mật lớn. Điều gì nếu một trong các tên tệp có dạng blahblah; rm -r * blahblah.jpg?
xhienne

1

Sắp xếp theo thời gian, giới hạn ở jpg, số 0 đứng đầu và tên cơ sở (trong trường hợp bạn có thể muốn một cái):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(tất cả trên một dòng, không có \)


Trong sơ đồ lớn của mọi thứ, nhiều câu trả lời trên trang này thật kinh khủng, vì vậy có lẽ điều này không đặc biệt xứng đáng với một downvote. lsMặc dù vậy, tôi ngần ngại nâng cấp bất cứ điều gì sử dụng trong một kịch bản.
tripleee

Tôi lưu câu trả lời này từ mặt tiêu cực vì trong khi có lẽ mong manh, nó hoạt động cho một trường hợp sử dụng cụ thể mà tôi có.
Ville

1
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

đổi tên -vn - xóa n để tắt chế độ kiểm tra

{$ i = 1;} - số bắt đầu kiểm soát

"% 04d.jpg" - kiểm soát số zero 04 và mở rộng bộ sản lượng .jpg


Nâng cao câu trả lời này vì nó chỉ sử dụng tên riêng. Trường hợp sử dụng của tôi là thay thế hai chữ số đầu tiên của tệp bằng các số bắt đầu từ 01:rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
minterior

1

Đối với tôi sự kết hợp các câu trả lời này hoạt động hoàn hảo:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v giúp sắp xếp đúng 1 10 9 theo thứ tự: 1 9 10 theo thứ tự, tránh các vấn đề mở rộng tên tệp với jpg JPG jpeg
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'gia hạn với 4 ký tự và số không đầu. Bằng cách tránh mv tôi không vô tình cố gắng ghi đè lên bất cứ thứ gì đã có bằng cách vô tình có cùng một số.
  • bash thực thi

Hãy nhận biết những gì @xhienne đã nói, việc đưa nội dung không xác định vào bash là một rủi ro bảo mật. Nhưng đây không phải là trường hợp của tôi khi tôi đang sử dụng những bức ảnh được quét.


0

Bạn cũng có thể sử dụng ls

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash

5
Xem mywiki.wooledge.org/ParsingLs , và các mô tả về các lỗ hổng bảo mật trên các giải pháp bị hỏng tương tự khác.
Charles Duffy

1
KHÔNG sử dụng cái này. Chuyển hướng đến bash như thế này là một rủi ro bảo mật lớn. Điều gì nếu một trong các tên tệp có dạng blahblah; rm -r * blahblah.JPG?
xhienne

0

Phần lớn các giải pháp khác sẽ ghi đè lên các tệp hiện có đã được đặt tên là một số. Điều này đặc biệt là một vấn đề nếu chạy tập lệnh, thêm nhiều tập tin và sau đó chạy lại tập lệnh.

Kịch bản này đổi tên các tệp số hiện có trước:

#!/usr/bin/perl

use strict;
use warnings;

use File::Temp qw/tempfile/;

my $dir = $ARGV[0]
    or die "Please specify directory as first argument";

opendir(my $dh, $dir) or die "can't opendir $dir: $!";

# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
    for my $old (@files) {
        my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
        my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
        close $fh;
        rename "$dir/$old", $new;
    }
}

rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
    next if $file =~ /\A\.\.?\z/;
    my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
    rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext); 
}

0

Oneliner này liệt kê tất cả các tệp trong thư mục hiện tại, sắp xếp theo dấu thời gian tạo theo thứ tự ngược lại (có nghĩa là tệp cũ nhất ở đầu) và tự động đổi tên với các số 0 theo yêu cầu theo số lượng tệp. Phần mở rộng tập tin sẽ được bảo tồn.

Tôi thường chỉ có một thư mục từ nhiều năm cho hình ảnh và phim trên điện thoại di động. Áp dụng lệnh này, hình ảnh và phim của tôi đã sẵn sàng để trình chiếu theo đúng thứ tự trên TV hoặc lưu trữ.

Xin lưu ý rằng nếu bạn có xung đột tên tệp, bạn đang mất tệp. Vì vậy, trước tiên đổi tên thành một cái gì đó kỳ lạ như temp001.jpgsau đó thực hiện thành tên tệp cuối cùng của bạn.

DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done

1
Chạy lskhông chỉ một lần mà hai lần như thế này tốt hơn nên tránh, nhưng tôi chưa nghiên cứu sâu về nó.
tripleee

1. Nếu tôi đề xuất một cách cố ý một oneliner, tại sao bạn lại thay đổi nó sau đó? Nhiều người dùng như tôi thích sao chép-dán một oneliner để hoàn thành nhiệm vụ. Đối với những người khác thích sao chép từng dòng, có một câu trả lời khác trong chủ đề này. 2. Câu hỏi ban đầu là "số lượng các số 0 đứng đầu tùy thuộc vào tổng số lượng tệp" và điều này được thực hiện trước tiên ls, vì vậy đó là lý do tại sao hai trong số chúng được yêu cầu. 3. Các lệnh như vậy là một lần và không có nghĩa là được bao gồm trong các tập lệnh, vì vậy có một lý do tại sao mọi người thích một lớp lót
Flavio Aiello

1
Xin lỗi, không nhận ra bạn nghĩ đó là quan trọng. Đối với tôi, việc có thể đọc mã lớn hơn hẳn khả năng sao chép / dán mã dưới dạng một dòng. Tôi đã không tìm thấy một môi trường nơi Bash sẽ gặp vấn đề với một miếng dán trải dài trên nhiều dòng, nhưng tôi có thể đang nhìn vào thứ gì đó.
tripleee

0

Đây là những gì làm việc cho tôi.
Tôi đã sử dụng lệnh đổi tên để nếu có bất kỳ tệp nào chứa khoảng trắng trong tên của nó thì mv lệnh không bị lẫn lộn giữa khoảng trắng và tệp thực tế.

Ở đây tôi đã thay thế dấu cách, '' trong tên tệp bằng '_' cho tất cả các tệp jpg
#! / thùng / bash
đổi tên 'y / / _ /' * jpg # thay thế khoảng trắng bằng _
đặt x = 0;
cho tôi trong * .jpg; làm
    đặt x = (x + 1)
    mv $ i $ x.jpg
làm xong

Cài đặt đổi tên trên linux (ubfox), "sudo apt install rename"
rishang bhavsar

0

Ngày nay, có một tùy chọn sau khi bạn chọn nhiều tệp để đổi tên (tôi đã thấy trong trình quản lý tệp thunar).

  1. chọn nhiều tập tin
  2. kiểm tra tùy chọn
  3. chọn đổi tên

Một dấu nhắc đi kèm với tất cả các tệp trong thư mục cụ thể đó, chỉ cần kiểm tra với phần danh mục


-1

Tập lệnh này sẽ sắp xếp các tệp theo ngày tạo trên bash Mac OS. Tôi sử dụng nó để đổi tên hàng loạt video. Chỉ cần thay đổi phần mở rộng và phần đầu tiên của tên.

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash

1
KHÔNG sử dụng cái này. Chuyển hướng đến bash như thế này là một rủi ro bảo mật lớn. Điều gì nếu một trong các tên tệp có dạng blahblah; rm -r * blahblah.mp4?
xhienne

-1

Đây là một giải pháp khác với lệnh "đổi tên":

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'

Để khôi phục các số không hàng đầu:rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Camille Goudeseune

Không hoạt động như mong đợi, đối với một thư mục có các tệp có tên như thế này: DSC_3451.JPG, DSC_3452.JPG, v.v., hãy tìm -name '* .JPG' | sắp xếp -Vr | đổi tên 's / (\ d +) / $ 1 + 1 / ge' không sửa đổi gì
Tiberiu C.

-2

Câu trả lời của mọi người đã đưa tôi đến đây :)

Tôi muốn đổi tên các tệp theo thời gian vì người xem hình ảnh không hiển thị hình ảnh theo thứ tự thời gian.

ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

2
KHÔNG sử dụng cái này. Chuyển hướng đến bash như thế này là một rủi ro bảo mật lớn. Điều gì nếu một trong các tên tệp có dạng blahblah; rm -r * blahblah.jpg? Chỉ là một ví dụ cực đoan.
xhienne

-2

Nếu bạn đang sử dụng Annotator hình ảnh để ghi nhãn hình ảnh.

$ make qt5py3

$ python3 labelImg.py


-3

Để đánh số lại 6000, các tệp trong một thư mục bạn có thể sử dụng tùy chọn 'Đổi tên' của chương trình ACDsee.

Để xác định tiền tố sử dụng định dạng này: ####"*"

Sau đó đặt số bắt đầu và nhấn Đổi tên và chương trình sẽ đổi tên tất cả 6000 tệp với các số liên tiếp.


1
OP yêu cầu một bộ lệnh trong Unix Bourne Shell. Bạn đang đề xuất một sản phẩm thương mại chỉ chạy trong môi trường Windows.
xhienne
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.