我有一位客户,他给了我一台古老的 PowerMac G4,它有一个无法启动的操作系统和一个坏掉的硬盘,让我从中检索文件。我整天都在忙于这件事,并成功检索了他的文件,但他现在的现代电脑是 Windows 桌面,而且出于某种原因,他旧机器上的许多文件名中都有星号 ( *
) 或冒号 ( :
)...
问题是 Windows 不允许在文件名中使用这些字符。我是否可以在 Linux 笔记本电脑上运行终端命令或脚本等,批量从他的文件中删除这些字符,以便他可以将它们复制到 Windows 桌面,而不必手动重命名 500 个东西……?
谢谢! :)
答案1
您可以使用基于 perl 的rename
命令,用 perl 的内置命令tr
(音译)代替更常用的命令s
(替代)。
前已给出
$ ls *[:*]*
'a::b*:c' bar:bam 'foo*baz'
然后
$ rename -n 'tr/:*/-_/' *
rename(a::b*:c, a--b_-c)
rename(bar:bam, bar-bam)
rename(foo*baz, foo_baz)
答案2
我了解到一个非常方便的软件包,叫做detox
,它会从特定目录中的所有文件中删除有问题的字符。非常有用!
要安装它,你可以从以下位置下载 tar.gz 文件这里,将其解压, cd
进入解压的目录并运行:
./configure
make
sudo make install
查看自述有关该包的编译的更多信息。
该包的网页上的使用示例:
$ ls Future Crew - Skaven - 2nd Reality.s3m $ detox -v . Scanning: . ./Future Crew - Skaven - 2nd Reality.s3m -> ./Future_Crew-Skaven-2nd_Reality.s3m $ ls Future_Crew-Skaven-2nd_Reality.s3m
有关如何使用它的更多信息,请参阅detox
手册页。
答案扩展自OP 在问题中的回答。
答案3
假设您在使用 Bash 的 Ubuntu 机器上:
使用命令列出目录中的坏文件名,
ls
并将文件命名为listbadnames
。首先将默认目录更改为包含坏文件的目录:cd somedirectory ls > badnames
使用
tr
将坏字符更改为好字符(例如,随机选择不保证与 Windows 兼容的字符:和):
,将好名称放入名为 的文件中:.
*
-
goodnames
cat badnames | tr ":*" ".-" > goodnames
将两个文件粘贴在一起(检查是否有重复等):
paste badnames goodnames > pairednames
将命令添加
mv
到 中每行的开头pairednames
。运行重命名:
bash pairednames
如果您将 放在目录结构中而不是全部放在一个目录中,那么事情会稍微困难一些。badfiles
从顶部开始,使用 命令find
而不是ls
。