从文件名中删除某些特殊字符

从文件名中删除某些特殊字符

我在将文件夹传输到外部硬盘时遇到问题 - 我不想更改硬盘上的格式。

因此,文件夹中有 100 个文件,阻止我复制它们的错误来自特殊字符(我不知道具体是哪些,但我相信是“|”和“。”,我确信还有其他。我一直在手动重命名/删除这些,但这很麻烦。

欢迎提出建议,但我“猜”我正在寻找一种方法来从文件名中删除这些特定字符(这样做会导致 .m4a 等出现问题吗?),或者在必要时用下划线替换它们。我有一个线索是 perl 重命名,但我还没有尝试过。

像这样重命名‘y/|/_/’*?

感谢任何建议

答案1

是的,(基于 Perl 的)rename命令是此操作的不错选择。您可以添加-n--nono选项来试运行替换,例如:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

例如

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

rename请注意不是如果文件名称不唯一,则允许您破坏性地覆盖文件:

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

.注意不是文件名上下文中的特殊字符,因此我建议不要实际替换它。

答案2

总体而言,mmv非常擅长批量重命名任务。

但在这种特殊情况下,我会采取完全不同的方式:用几个 shell 命令生成一个 shell 脚本,仔细查看它是否真的是我想要的,然后执行它。

大致轮廓:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Q将在每个名称周围添加双引号,即它将为您提供"foo*bar""foo | bar"

/tmp/new.txt然后使用编辑器手动替换 中不需要的字符,或者使用sed -i -e(或者perl -p -i -e如果您愿意) 或trtr -d。重要提示:不要改变该文件中的顺序,也不要删除或添加任何行!

无论如何,请仔细看看/tmp/new.txt这是否真的是您想要的新名称。

检查重复的名称!(sort /tmp/new.txt | uniq -r)确保没有重复,如果有,请手动编辑该行以获取唯一的名称。

然后将文件与paste命令放在一起,并将每一行更改为一个mv命令:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

paste命令的作用是取出 中的一行/tmp/old.txt和 中的一行/tmp/new.txt,然后将它们放在一行上,中间有一个空格。该部分在每行的开头sed添加。防止覆盖现有文件。mv -nmv -n

该文件现在包含很多行,例如

mv -n "foo" "bar"
mv -n "abc" "def"

再次查看该文件,当您确定它是您想要的时,使用 执行它sh /tmp/bulk-rename

相关内容