有没有办法从多个文件名中删除一个字符

有没有办法从多个文件名中删除一个字符

我有一位客户,他给了我一台古老的 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 机器上:

  1. 使用命令列出目录中的坏文件名,ls并将文件命名为list badnames。首先将默认目录更改为包含坏文件的目录:

    cd somedirectory
    ls > badnames
    
  2. 使用tr将坏字符更改为好字符(例如,随机选择不保证与 Windows 兼容的字符:和):,将好名称放入名为 的文件中:.*-goodnames

    cat badnames | tr ":*" ".-" > goodnames
    
  3. 将两个文件粘贴在一起(检查是否有重复等):

    paste badnames goodnames > pairednames
    
  4. 将命令添加mv到 中每行的开头pairednames

  5. 运行重命名:

    bash pairednames
    

如果您将 放在目录结构中而不是全部放在一个目录中,那么事情会稍微困难一些。badfiles从顶部开始,使用 命令find而不是ls

相关内容