【问题标题】:Rename files reading old file name and new file name from a txt file (bash)重命名从 txt 文件 (bash) 读取旧文件名和新文件名的文件
【发布时间】:2021-01-06 12:38:29
【问题描述】:

我需要重命名一个目录中的一堆文件:

2016001.fas
2016002.fas
2016003.fas
...

通读一个将实际文件名和新文件名标签分开的 .txt:

2016001 L.innocua001
2016002 L.innocua002
2016003 L.monocytogenes001
...

也许在 bash 中使用单行 for 循环或管道。

作为说明,如果需要,我还可以使用 .csv 或逗号分隔的 .txt 格式获取包含实际文件名和新文件名的列表。感谢您提供的帮助。

【问题讨论】:

  • 以后,请务必加入您解决问题的最佳尝试。我们不是来为您编写代码的。下面的好解决方案。祝你好运。
  • 再一次,这样的问题更适合Super User网站。祝你好运!

标签: bash rename file-rename


【解决方案1】:
xargs -a renames.txt -n 2 sh -c 'echo mv -- "$1.fas" "$2.fas"' _
  • xargs -a renames.txt:处理renames.txt 的内容作为命令的参数。
  • -n 2:一次选择 2 个参数。
  • sh -c: 命令是运行内联shell
  • 内联 shell 'echo mv -- "$1.fas" "$2.fas"':使用 xargs 提供的参数 1 和 2 执行实际重命名。
# remove echo when output matches the intent
echo mv -- "$1.fas" "$2.fas"

仅使用 shell 读取 renames.txt 并执行重命名的方法:

while read -r a b; do
  # Remove echo if satisfied by the output
  echo mv -- "$a.fas" "$b.fas"
done <renames.txt

使用 awk 将 renames.txt 文件转换为带有重命名命令的 shell 脚本的替代方法:

awk '{print "mv -- "$1".fas "$2".fas"}' renames.txt

一旦满足上述 awk 的输出;保存到 shell 脚本文件,或直接通过管道传输到 sh。

【讨论】:

  • 嗨 Léa,我尝试了前两种方法,但我不断收到这样的新文件:'L.innocua01'$'\r'.fas',你知道为什么会发生这种情况吗?名称更改成功,但添加了其他不需要的字符。
  • dos2unix renames.txt 应该可以解决您的问题,然后重新运行您的脚本。祝你好运。
  • 谢谢,转换文件后它工作了,很抱歉没有发布代码,我正在运行一个生物信息学程序,需要更改文件名以进行约定,我知道 bash 的基础知识但不知道编码。对可用软件包的了解有限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2016-09-23
  • 2021-02-04
  • 2014-09-09
  • 2023-02-22
相关资源
最近更新 更多