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


137

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

例:

我有

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

Answers:


224

感谢Peter van der Heijden,以下是适用于其中带有空格的文件名的一种:

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

(“-”需要以破折号开头的文件才能成功,否则其名称将被解释为mv命令的开关)


嘿,是的,如果文件中有空格,这将完全不起作用。
CanSpice

12
如果将ls命令更改为*,并将参数括在双引号中mv,则它将适用于包含空格的文件。
彼得·范德·海登

@CanSpice是否可以使用类似的脚本来反转此操作(删除前缀)?
Pascal Qyy 2012年

3
谢了哥们。实习生在这里松动了他的手指,重命名了全部67个文件。干杯。
费利佩

1
它应该是“ mv-”而不仅仅是“ mv”,以防止以破折号开头的文件,否则将其解释为命令开关。我将进行编辑以更正此错误。
雅各布·C(Jacob C.)说应


61

要为文件(目录)添加前缀或后缀,可以通过xargs使用简单而强大的方法:

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

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

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


2
PS:如果您只想重命名当前目录的零件文件(目录),请在xargs之前对其进行过滤,例如:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin 2012年

有趣的是,使用重命名不起作用。在我的RHEL设置中使用xargs效果很好,因此对该选项+1可以使命令易于理解
Acewin 2013年

如果filename包含单引号,则不起作用,失败,并带有:xargs:不匹配的单引号;默认情况下,除非您使用-0选项,否则引号对xargs来说是特殊的
Evgeny Veretennikov,

36

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

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

上面的命令将在当前目录中的所有文件和文件夹前面加上PRE_


8

要使用util-linux rename(相对于prenameDebian和某些其他系统的perl变体)向当前目录中的所有文件和文件夹添加前缀,您可以执行以下操作:

rename '' <prefix> *

这将查找空字符串的第一个匹配项(立即发​​现),然后用您的前缀替换该匹配项,然后将其余文件名粘贴到该文件名的末尾。做完了

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


util-linux在Debian Stretch上似乎提供了这一点/usr/bin/rename.ul
user1338062

7

如果您有Ruby(1.9+)

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

7

使用Perl:

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

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

在我的系统上,我没有rename命令。这是一个简单的衬板。它以递归方式查找所有HTML文件,并prefix_在其名称前添加:

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

1
find你也可以执行命令,没有必要为一个循环:stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

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

${f%/*}是路径,直到最后一个斜线/- >目录

${f##*/}是无最后一个斜线之前的任何文本/- >文件名不带路径

就是这样:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.