从多个文件中删除 _000 的所有实例

从多个文件中删除 _000 的所有实例

不得不从死掉的硬盘中恢复我的音乐库......得到了我想要的一切,但所有音乐曲目名称都在末尾添加了 _000。

我真的不喜欢浏览 8000 个单独的音乐曲目并选择重命名以删除 _000 字符串

如何搜索包含所有专辑子目录的整个音乐文件夹并删除所有单独曲目名称上的每个 _000 实例?

答案1

虽然 mikesrv 解决方案更好、更安全,但我认为这也可以通过改名:

find Music/ -type f -name '*_000' -print0 | xargs -r0 rename -v '_000' ''

但仍然存在如上所述的潜在问题,例如album_00020_000将重命名为album20这显然不是所需的行为。
我认为 Debian 发行版是一个perl工具改名哪个可以做到。但不幸的是我找不到安装它的方法。所以我找到了以下perl脚本这里这就足够了:

#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

因此,您可以使该脚本可执行并运行:

find Music/ -type f -name '*_000' | /path_to_script/rename.pl 's/_000$//'

答案2

cd Music/..    &&
mkdir Music2   &&
pax -'rwls|\([^/]\)_000$|\1|p' Music Music2

如果从 的Music父目录运行,上述命令将在w/ 硬链接中创建一个名为Music2then 的镜像Music路径结构的目录,同时删除其中任何文件名尾部出现的 find 。Music2_000

之后,您基本上将有两条Music通往 的内容的路线Music/..- 一条路线中某些文件以尾随字符串命名,另一种路线中每个文件名的尾部比另一个文件名中的_000少一个_000_000(仅命名且未更改的文件除外)- 但实际文件未受影响。如果您发现这Music2/Music更适合您 -rm -rf Music以及mv Music2/Music Music之后。

假设 的所有Music内容都位于同一已安装的文件系统上并且支持硬链接。

下面使用perl-rename的是可以在cpan.org〜pederst/重命名。我在 Arch Linux 系统上安装了它pacman。现在,我听说还有另一个,更安全同名的 perl-script 也可以在以下位置找到cpan.org/~rmbarker/File-Rename-0.20。但我在使该功能发挥作用方面没有取得任何成功。不过,这次失败更有可能与我的无能有关。

不管怎样,这里有一个关于脚本重命名解决方案与基于模式的硬链接的危险的小案例研究。

mkdir Music Music2
echo file1 >Music/file
echo file2 >Music/file_000
pax -'rwls|_000$||p' Music Music2

我使用print 标志作为上面的-substitute 选项pax,因此pax打印仅有的它更改的文件的名称 - 尽管它链接了所有文件。它打印:

Music/file_000 >> Music/file

现在让我们看看我们是怎么做的:

grep . /dev/null Music/* Music2/Music/*

输出

Music/file:file1
Music/file_000:file2
Music2/Music/file:file2

呃。运行镜像操作时,链接file的结果file_000覆盖了先前存在的目录项。file但在这种情况下,原始链接仍然存在 - 因此该文件也存在。除了在文件的现有目录中保留副本 dentry 副本之外,pax (默认情况下) -p保留它可以保留的所有文件属性,无论它必须创建或复制的那些文件,因为它必须创建目录(不能硬链接)如果源位于不同的文件系统上(可以通过 完全避免-X它必须复制。

所以可以比较两个不同的目录事后为了差异进行任何不可更改的更改。通过print 标志,您可以获取它提供给您的结果,并将这些结果与任何现有的原始文件交叉引用 - 如果它们存在,那么您至少在新目标中是一个文件害羞的人。

但另一方面:

find Music -name \*_000 -exec perl-rename 's/_000$//' {} +
grep . /dev/null Music/*

输出

Music/file:file2

最后的文件的文件系统链接被覆盖 - 该文件是历史记录。

答案3

使用find命令递归枚举目录及其子目录中的文件。有多种方法可以重命名文件。您可以使用Linuxrename命令:

find Music -depth -name '*_000' -exec rename _000 '' {} \;

_000这将删除每个文件名中第一次出现的。请注意,如果您的文件名称包含_000在中间,则这不会为您提供所需的名称。

在 Debian 及其衍生版本(Ubuntu、Mint 等)上,rename命令是不同的; Linux 的称为rename.ulrename可以这样使用(_000即使中间有一个,它总是删除末尾的 ):

find Music -depth -name '*_000' -exec rename 's/_000$//' {} +

重命名这些文件的更简单方法是安装桀骜(在大多数发行版中可用)并使用其zmv功能。然后运行autoload -U zmv(或将其放入)~/.zshrc

zmv 'Music/**/*_000' '${f%_000}'

相关内容