使用其他文件中列表中的名称重命名编号文件

时间:2016-04-25 22:51:39

标签: shell ubuntu filenames

我有一个有书籍的文件夹,我有一个文件,里面有每个文件的真实姓名。我以一种我很容易看到它们是否被命令的方式重命名它们,比如“00.pdf”,“01.pdf”等等。

我想知道是否有办法使用shell来匹配文件的每一行,比如说“names”,与每个文件匹配。实际上,请按照排序顺序将文件的行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,但我对正则表达式的要求并不理想......

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

循环遍历names.txt,根据计数器创建文件名(使用printf填充到两位数,使用-v分配给变量),然后使用{{1}重命名}。 mv会增加下一个文件名的计数器。

((++i))