我在将文件夹传输到外部硬盘时遇到问题 - 我不想更改硬盘上的格式。
因此,文件夹中有 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
如果您愿意) 或tr
或tr -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 -n
mv -n
该文件现在包含很多行,例如
mv -n "foo" "bar"
mv -n "abc" "def"
再次查看该文件,当您确定它是您想要的时,使用 执行它sh /tmp/bulk-rename
。