Đổi tên tệp và thư mục (Thêm tiền tố)


137

Tôi muốn thêm tiền tố vào tất cả các thư mục và thư mục.

Thí dụ:

Tôi có

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Tôi muốn thêm tiền tố "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

Trân trọng,


Sử dụng AWK như trên câu trả lời này : awk '$ 0 = "tiền tố" tập tin $ 0'> new_file
Đánh dấu

Câu trả lời:


224

Cảm ơn Peter van der Heijden , đây là một cái sẽ hoạt động cho tên tập tin có không gian trong đó:

for f in * ; do mv -- "$f" "PRE_$f" ; done

("-" là cần thiết để thành công với các tệp bắt đầu bằng dấu gạch ngang, có tên khác được hiểu là các công tắc cho lệnh mv)


Heh, đúng, điều này sẽ hoàn toàn không hoạt động nếu bạn có một tệp có khoảng trắng trong đó.
CanSpice

12
Nếu bạn thay đổi lslệnh thành *và đặt dấu ngoặc kép xung quanh các đối số thành mv, nó sẽ hoạt động đối với các tệp chứa khoảng trắng.
Peter van der Heijden

@CanSpice Có thể đảo ngược thao tác này (loại bỏ tiền tố) bằng một tập lệnh tương tự không?
Pascal Qyy

3
Cảm ơn, bạn đời. Thực tập sinh ở đây đã mất mũ ngón tay của mình đổi tên tất cả 67 tập tin. Chúc mừng.
Felipe

1
Nó phải là "mv -" không chỉ là "mv", để bảo vệ chống lại các tệp bắt đầu bằng dấu gạch ngang, nếu không sẽ được hiểu là chuyển đổi lệnh. Tôi sẽ đóng góp một chỉnh sửa để sửa lỗi này.
Jacob C. nói Phục hồi lại

81

Sử dụng các đổi tên kịch bản theo cách này:

$ rename 's/^/PRE_/' *

Không có vấn đề với siêu nhân vật hoặc khoảng trắng trong tên tệp.


3
Một số hệ thống có tiện ích linux-linux gọi là "rename" hoạt động khác nhau (trên Ubuntu, nó được gọi là "rename.ul").
Tạm dừng cho đến khi có thông báo mới.

renameluôn luôn giúp tôi xử lý nhiều lần đổi tên tập tin rất dễ dàng.
Alan Haggai Alavi

61

Để thêm tiền tố hoặc hậu tố cho các tệp (thư mục), bạn có thể sử dụng cách đơn giản và mạnh mẽ của xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Nó đang sử dụng tùy chọn thay thế paramerter của xargs: -I. Và bạn có thể biết thêm chi tiết từ trang người đàn ông.


2
PS: Nếu bạn chỉ muốn đổi tên một phần tệp (thư mục) của thư mục hiện tại, chỉ cần lọc nó trước xargs, chẳng hạn như:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin

thú vị khi sử dụng đổi tên không hoạt động. sử dụng xargs rất tốt cho thiết lập RHEL của tôi vì vậy +1 cho tùy chọn này, giúp dễ hiểu lệnh
Acewin

Không hoạt động nếu tên tệp chứa trích dẫn đơn, thất bại với: xargs: trích dẫn đơn chưa từng có; theo mặc định, trích dẫn là đặc biệt đối với xargs trừ khi bạn sử dụng tùy chọn -0
Evgeny Veretennikov

36

Điều này có thể được thực hiện bằng cách chạy một findlệnh đơn giản :

find * -maxdepth 0 -exec mv {} PRE_{} \;

Lệnh trên sẽ tiền tố tất cả các tệp và thư mục trong thư mục hiện tại với PRE_.


8

Để thêm tiền tố vào tất cả các tệp và thư mục trong thư mục hiện tại bằng cách sử dụng linux-linux rename(trái ngược với prenamebiến thể perl từ Debian và một số hệ thống khác), bạn có thể làm:

rename '' <prefix> *

Điều này tìm thấy sự xuất hiện đầu tiên của chuỗi trống (được tìm thấy ngay lập tức) và sau đó thay thế sự xuất hiện đó bằng tiền tố của bạn, sau đó dán vào phần còn lại của tên tệp vào cuối chuỗi đó. Làm xong.

Đối với hậu tố , bạn cần sử dụng phiên bản perl hoặc sử dụng find .


util-linuxtrên Debian Stretch dường như cung cấp điều này như /usr/bin/rename.ul.
user1338062

7

Nếu bạn có Ruby (1.9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'

7

với Perl:

perl -e 'rename $_, "PRE_$_" for <*>'

2

Đây là một kịch bản đơn giản mà bạn có thể sử dụng. Tôi thích sử dụng mô-đun không chuẩn File::chdirđể xử lý các cdhoạt động quản lý , vì vậy để sử dụng tập lệnh này như là bạn sẽ cần phải cài đặt nó ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}

1

Trên hệ thống của tôi, tôi không có renamelệnh. Đây là một lót đơn giản. Nó tìm thấy tất cả các tệp HTML theo cách đệ quy và thêm prefix_vào trước tên của chúng:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
với findbạn cũng có thể thực thi các lệnh, không cần vòng lặp: stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

Điều này sẽ tiền tố các tập tin của bạn trong thư mục của họ.

Các ${f%/*}là con đường cho đến khi dấu gạch chéo cuối cùng /-> thư mục

Các ${f##*/}là nội dung mà không cần bất cứ điều gì trước khi dấu gạch chéo cuối cùng /-> filename mà không có con đường

Vì vậy, đó là cách nó đi:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
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.