2011-01-24 38 views
83

Tôi muốn thêm tiền tố vào tất cả các thư mục và thư mục.Đổi tên tệp và thư mục (Thêm tiền tố)

Ví 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/ 

Kính trọng,

Trả lời

136

Nhờ Peter van der Heijden, đây là một trong đó sẽ làm việc cho tên tệp có không gian trong đó:

for f in * ; do mv "$f" "PRE_$f" ; done 
+1

hãy cẩn thận về tên tệp có không gian trong đó ... – Alnitak

+0

Heh, true, điều này sẽ hoàn toàn không hoạt động nếu bạn có tệp có không gian trong đó. – CanSpice

+10

Nếu bạn thay đổi lệnh 'ls' thành' * 'và đặt dấu ngoặc kép xung quanh các đối số thành' mv', nó sẽ làm việc cho các tệp có chứa dấu cách. –

69

Sử dụng the rename script theo cách này:

$ rename 's/^/PRE_/' * 

Không có vấn đề với metacharacters hoặc khoảng trắng trong tên tập tin.

+2

Một số hệ thống có một tiện ích util-linux được gọi là "đổi tên" hoạt động khác nhau (trên Ubuntu nó được gọi là "rename.ul"). –

+0

'đổi tên' luôn giúp tôi xử lý nhiều tên tệp một cách dễ dàng. –

6

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

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

với Perl:

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

Dưới đâ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 phi tiêu chuẩn File::chdir để xử lý các hoạt động quản lý cd, do đó, để sử dụng tập lệnh này như là, bạn sẽ cần 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: $!"; 
} 
45

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

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

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

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

+2

P.S .: 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 _ {} ' –

+0

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

1

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

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

Điều này có thể được thực hiện chạy một find lệnh đơn giản:

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

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

7

Để thêm một tiền tố để tất cả các file và thư mục trong thư mục hiện hành sử dụng util-linux của rename (như trái ngược với prename, phiên bản 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 rỗ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 các phần còn lại của tên tệp vào cuối phần đó. Làm xong.

Đối với hậu tố, bạn cần phải use the perl version hoặc use find.

0

Điều này sẽ tiền tố tệp của bạn trong thư mục của chúng.

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 
Các vấn đề liên quan