【问题标题】:Renames numbered files using names from list in other file使用另一个文件中列表中的名称重命名编号文件
【发布时间】:2016-04-25 22:51:39
【问题描述】:

我有一个存放书籍的文件夹,并且我有一个包含每个文件真实名称的文件。我以一种我可以轻松查看它们是否已订购的方式重命名它们,例如“00.pdf”、“01.pdf”等等。

我想知道是否有一种方法可以使用 shell 将文件的每一行(比如“名称”)与每个文件匹配。实际上,将文件的行i与位置i中的书按排序顺序匹配。

<name-of-the-book-in-the-1-line>  ->  <book-in-the-1-position>
<name-of-the-book-in-the-2-line>  ->  <book-in-the-2-position>
.
.
.
<name-of-the-book-in-the-i-line>  ->  <book-in-the-i-position> 
.
.
.

我在 Windows 中使用 Total Commander 执行此操作,但我想在 Ubuntu 中执行此操作,因此无需重新启动。

我知道mvrename,但是我在正则表达式方面没有我想要的那么好......

【问题讨论】:

  • 怎么知道哪个文件对应哪个全名?这个数字是唯一的吗?
  • 我按升序(00、01、...、N)打开文件,想了个名字,写在文件“names”中
  • name-book-01.pdf如何变成01.pdf,而name-book-99.pdf 变成 00.pdfname-book-100.pdf 会发生什么?
  • 我还不清楚。必须有一种方法可以知道哪个全名对应哪个短名,而“想一个名字”并没有告诉我这一点。加上@KenWhite 指出的不一致。
  • 你应该edit这个问题添加。

标签: shell ubuntu filenames


【解决方案1】:

renamer.sh:

#!/bin/bash
for i in `ls -v |grep -Ev '(renamer.sh|names.txt)'`; do
    read name
    mv "$i" "$name.pdf"
    echo "$i" renamed to "$name.pdf"
done < names.txt

names.txt:(行数必须完全等于编号的文件数)

name of first book
second-great-book
...

解释:

  • ls -v 返回自然排序的文件列表
  • grep 排除此脚本名称和不重命名的输入文件
  • 我们循环遍历找到的文件名,从文件中读取值并用这个值重命名目标文件

出于测试目的,您可以将mv 命令注释掉:

#mv "$i" "$name"

现在,只需运行脚本:

bash renamer.sh

【讨论】:

  • 一个好的调试/安全技术是在脚本中使用echo "$i" "$name.pdf"。查看该输出,并确认脚本在需要时工作....然后删除echo,所有文件将在 O.P. 重新运行时重命名。祝大家好运。
  • 这正是我需要的程序。谢谢!
  • 在文件中我写了带有扩展名的名称,所以这行得通。但这是一个很好的观点
  • 好的,所以只需从脚本中删除 .pdf 扩展名即可。享受它,而不是在行动之前进行备份;)
【解决方案2】:

这循环通过names.txt,基于计数器创建文件名(使用printf 填充到两位数,使用-v 分配给变量),然后使用mv 重命名。 ((++i)) 增加下一个文件名的计数器。

#!/bin/bash

i=0
while IFS= read -r line; do
    printf -v fname "%02d.pdf" "$i"
    mv "$fname" "$line"
    ((++i))
done < names.txt

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2015-10-23
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2017-07-13
    • 2020-12-03
    相关资源
    最近更新 更多