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

Posted

技术标签:

【中文标题】重命名文件和目录(添加前缀)【英文标题】:Rename Files and Directories (Add Prefix) 【发布时间】:2011-06-14 19:36:54 【问题描述】:

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

例子:

我有

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/

问候,

【问题讨论】:

在 this 上使用 AWK 答案:awk '$0="prefix"$0' file > new_file 【参考方案1】:

感谢Peter van der Heijden,这里有一个适用于包含空格的文件名:

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

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

【讨论】:

嘿,没错,如果你的文件中有空格,这将完全不起作用。 如果您将ls 命令更改为* 并在mv 的参数两边加上双引号,它将适用于包含空格的文件。 @CanSpice 是否可以用类似的脚本来反转这个操作(去掉前缀)? 谢谢,伙计。这里的实习生在重命名所有 67 个文件时失去了他的手指帽。干杯。 它应该是“mv --”而不仅仅是“mv”,以防止文件以破折号开头,否则会被解释为命令开关。我将提供一个编辑来纠正这个问题。【参考方案2】:

这样使用the rename script:

$ rename 's/^/PRE_/' *

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

【讨论】:

有些系统有一个名为“rename”的 util-linux 实用程序,它的工作方式不同(在 Ubuntu 上它被称为“rename.ul”)。 rename 一直帮助我非常轻松地处理多个文件重命名。 前缀中的 @ 符号有问题。需要 \@ 但这很容易。效果很好。【参考方案3】:

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

ls | xargs -I  mv  PRE_

ls | xargs -I  mv  _SUF

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

【讨论】:

P.S.:如果只想重命名当前目录的部分文件(目录),只需在xargs前过滤即可,如:ls *.old | xargs -I mv PRE_ 有趣的是使用重命名不起作用。使用 xargs 非常适合我的 RHEL 设置,所以 +1 为这个选项,让理解命令变得容易 如果文件名包含单引号则不起作用,失败并显示:xargs:不匹配的单引号;默认情况下,引号对 xargs 来说是特殊的,除非您使用 -0 选项【参考方案4】:

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

find * -maxdepth 0 -exec mv  PRE_ \;

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

【讨论】:

【参考方案5】:

要使用 util-linux 的 rename(而不是 prename,Debian 和某些其他系统的 perl 变体)为当前目录中的所有文件和文件夹添加前缀,您可以:

rename '' <prefix> *

这会找到第一次出现的空字符串(立即找到),然后用您的前缀替换该出现的位置,然后将文件名的其余部分粘贴到该文件名的末尾。完成。

对于后缀,您需要use the perl version 或use find。

【讨论】:

Debian Stretch 上的 util-linux 似乎将其提供为 /usr/bin/rename.ul【参考方案6】:

如果你有 Ruby(1.9+)

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

【讨论】:

【参考方案7】:

使用 Perl:

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

【讨论】:

【参考方案8】:

这是一个您可以使用的简单脚本。我喜欢使用非标准模块 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: $!";

【讨论】:

【参考方案9】:

在我的系统上,我没有rename 命令。这是一个简单的单列。它递归查找所有 html 文件,并在其名称前添加 prefix_

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

【讨论】:

find也可以执行命令,不需要循环:***.com/a/33297439/2351568【参考方案10】:

这将为您的文件在其目录中添加前缀。

$f%/* 是直到最后一个斜杠 / 的路径 -> 目录

$f##*/ 是在最后一个斜线 / 之前没有任何内容的文本 -> 没有路径的文件名

原来如此:

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

【讨论】:

以上是关于重命名文件和目录(添加前缀)的主要内容,如果未能解决你的问题,请参考以下文章

重命名文件夹中的多个文件,添加前缀 (Windows)

如何以照片的拍摄时间批量重命名文件

在 Windows 7 中使用 REN 批量重命名文件(添加前缀)

通过添加前缀 -in R 重命名数据框的列

COM Interop的重命名/前缀类

js 如何批量重命名文件