重命名文件和目录(添加前缀)
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
【讨论】:
以上是关于重命名文件和目录(添加前缀)的主要内容,如果未能解决你的问题,请参考以下文章