重命名文件和目录(添加前缀)

200

我想在所有文件夹和目录上添加前缀。

例如:

我有

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

我想要添加前缀“PRE_”

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

使用 AWK,就像这个答案中所示:awk '$0="prefix"$0' file > new_file - Mark
11个回答

308

感谢Peter van der Heijden的帮助,这是一个适用于文件名中包含空格的解决方案:

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

("--"被用于成功操作以破折号开头的文件,否则它们的名称可能会被解释为mv命令的开关)


14
如果你将 ls 命令更改为 * 并在 mv 命令的参数周围加上双引号,那么它将适用于包含空格的文件。 - heijp06
@CanSpice 用类似的脚本是否可以反转这个操作(删除前缀)? - Pascal Qyy
6
谢谢,兄弟。这里的实习生重命名了所有67个文件,手指都快脱皮了。干杯! - Felipe
2
应该使用"mv --"而不是仅仅的"mv",以防止以破折号开头的文件被解释为命令开关。我将贡献一份编辑来纠正这个问题。 - Jacob C.
这在 bash 中运行良好,我该如何在 tcsh 中实现? - The_Learner
显示剩余3条评论

111

这样使用重命名脚本

$ rename 's/^/PRE_/' *

文件名中的元字符或空格没有问题。


5
有些系统拥有一个名为“rename”的util-linux实用程序,其工作方式不同(在Ubuntu上它被称为“rename.ul”)。 - Dennis Williamson
“rename” 一直帮助我轻松处理多个文件重命名。 - Alan Haggai Alavi
在前缀中遇到了@符号的问题。需要使用@,但这很容易解决。运行良好。 - null

83

使用 xargs 可以简单而强大地为文件(目录)添加前缀或后缀:

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

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

它正在使用xargs的参数替换选项:-I。您可以从man页面获取更多详细信息。


3
如果你只想重命名当前目录下的部分文件(目录),在使用 xargs 命令之前,可以先进行筛选,例如:ls *.old | xargs -I {} mv {} PRE_{} - Zheng Qsin
有趣的是,使用重命名并没有起作用。在我的RHEL设置中使用xargs很好,因此对于这个选项我给出+1,使命令易于理解。 - Acewin
如果文件名包含单引号,则无法正常工作,会出现以下错误:xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option。 - Evgeny Veretennikov
如果文件名包含换行符,它也会进行归档。 - undefined

54

可以通过运行简单的find命令来完成:

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

上述命令会在当前目录下给所有文件和文件夹添加前缀 PRE_


15

使用 util-linux 的 rename(而不是来自 Debian 和某些其他系统的 perl 变体 prename)在当前目录下为所有文件和文件夹添加前缀,可以执行以下操作:

rename '' <prefix> *

这将找到第一个出现的空字符串(立即找到)并将该出现替换为您的前缀,然后将其余的文件名附加到其末尾。 完成。

对于后缀,您需要使用perl版本使用find命令


在Debian Stretch上,util-linux将其作为/usr/bin/rename.ul提供。 - user1338062
1
这个不起作用。 - Jonathan
这对我来说很有效 rename 's/^/some_prefix_here/' * - undefined

8

使用 Perl:

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

这是最好的方法。它处理了其他方法无法处理的包含换行符、单引号和双引号的文件名。 - undefined

7
如果您拥有Ruby(1.9+),
ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'

3

在我的系统中,我没有rename命令。这里有一个简单的一行命令。它会递归查找所有HTML文件,并在它们的名称前面添加prefix_

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

1
使用 find 命令,您无需循环即可执行命令:https://dev59.com/g2445IYBdhLWcg3wl7XW#33297439 - DJCrashdummy

2

这里是一个简单的脚本,您可以使用它。我喜欢使用非标准模块File::chdir来处理管理cd操作,因此要按原样使用此脚本,您需要安装它(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

这将在文件目录中添加前缀。

${f%/*} 是路径直到最后一个斜杠/,即目录。

${f##*/} 是最后一个斜杠/之后的文本,即没有路径的文件名。

所以就是这样:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接