Tôi đã thấy mọi người đề cập đến một rename
lệnh, nhưng nó không thường xuyên có sẵn trên các hệ thống Unix (trái ngược với các hệ thống Linux, chẳng hạn, hoặc Cygwin - trên cả hai, đổi tên là một tệp thực thi chứ không phải là một tập lệnh). Phiên bản đó rename
có một chức năng khá hạn chế:
rename from to file ...
Nó thay thế phần từ của tên tệp bằng đến và ví dụ được đưa ra trong trang người đàn ông là:
rename foo foo0 foo? foo??
Thao tác này đổi tên foo1 thành foo01 và foo10 thành foo010, v.v.
Tôi sử dụng một tập lệnh Perl có tên rename
, mà ban đầu tôi đã đào ra từ cuốn sách Camel xuất bản đầu tiên, vào khoảng năm 1992, và sau đó mở rộng, để đổi tên tệp.
#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command
use strict;
use Getopt::Std;
my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;
die $usage unless getopts('fnxV', \%opts);
if ($opts{V})
{
printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});
my($op) = shift;
die $usage unless defined $op;
if (!@ARGV) {
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV)
{
if (-e $_ || -l $_)
{
my($was) = $_;
eval $op;
die $@ if $@;
next if ($was eq $_);
if ($force == 0 && -f $_)
{
print STDERR "rename failed: $was - $_ exists\n";
}
else
{
print "+ $was --> $_\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, $_));
}
}
else
{
print STDERR "$_ - $!\n";
}
}
Điều này cho phép bạn viết bất kỳ lệnh thay thế Perl hoặc chuyển ngữ nào để ánh xạ tên tệp. Trong ví dụ cụ thể được yêu cầu, bạn sẽ sử dụng:
rename 's/^/new./' original.filename