Bash / batch多个文件,单个文件夹,incrimental rename脚本;用户提供的文件名前缀参数

时间:2011-08-11 09:33:27

标签: bash batch-file file-rename batch-rename

我有一个需要重命名的文件夹。

我需要首先提供一个命名约定,以确保文件夹中的文件名完整性,而不是一个简单的incrimental数字重命名函数。

说我有文件:

wei12346.txt
wifr5678.txt
dkgj5678.txt

需要重命名为:

Eac-345-018.txt
Eac-345-019.txt
Eac-345-020.txt

每次我运行脚本时,命名可能会有所不同,并且随之而来的数字化也可能是不同的:

Ebc-345-010.pdf
Ebc-345-011.pdf
Ebc-345-012.pdf

所以我需要询问用户提供的参数,我认为这可能是有用的,因为要索引的文件列表中的先前文件名例如:Eac-345-017.txt

另一件我不确定的事情就是脚本如何处理099到100或999到1000,因为我不知道这个过程是如何进行的。

我被告知这是perl中的一个简单脚本但是我在工作的Windows机器上运行cygwin并且只能访问bash和windows shell以执行脚本。

任何指示让我前进的人都会非常感激,我有一些编程经验,但脚本几乎全新。

谢谢, 克雷格

(据我所知,这类事情的帖子已经分配,​​但似乎没有提供任何简明的答案,因此我的问题)

2 个答案:

答案 0 :(得分:0)

好的,您可以执行以下操作。您可以先询问用户前缀,然后再询问起始序列号。然后,您可以使用printf中的内置bash对数字进行正确的格式化,但您可能必须决定提供足够的数字宽度来保存所有序列,因为这会导致以更加同质的名义。您可以使用read来读取用户输入:

echo -n "Insert the prefix: "
read prefix
echo -n "Insert the sequence number: "
read sn

for i in * ; do
  fp=`printf %04d $sn`
  mv "$i" "$prefix-$fp.txt"
  sn=`expr $sn + 1`
done

注意:您也可以提取扩展名。那不是问题。此外,在这里我选择了4个数字来计算序列号,计算到变量$fp

答案 1 :(得分:0)

#!/bin/bash

prefix="$1"
shift

base_n="$1"
shift

step="$1"
shift

n=$base_n

for file in "$@" ; do
    formatted_n=$(printf "%03d" $n)
    # re-use original file extension whilke we're at it.
    mv "$file" "${prefix}-${formatted_n}.${file##*.}"
    let n=n+$step
done

保存文件,像这样调用它:

bash fancy_rename.sh Ebc-345- 10 1 /path/to/files/*

注意:在您的示例中,您将“.txt”重命名为.pdf,但我认为扩展名将保持不变。如果你真的想改变扩展,那么这将是一个微不足道的改变。如果你想实际转换文件格式,那么它会更复杂一些。

另请注意,我已使用%03d格式化递增数字。这意味着您的号码序列将是例如。

010
011
012
...
099
100
101
...
999
1000

意味着它将零填充到三个位置,但如果数字更大则会自动溢出。如果您更喜欢一致性(总是4位数),则应将填充更改为%04d