0

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

我需要首先提供一个命名约定,而不是简单的增量数字重命名函数,然后再进行增量以确保文件夹内的文件名完整性。

说我有文件:

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 来执行脚本。

任何让我前进的指针将不胜感激,我有一些编程经验,但脚本几乎是全新的。

谢谢,克雷格

(我知道已经有很多关于这类事情的帖子,但似乎没有一个提供任何简洁的答案,因此我的问题)

4

2 回答 2

0

好的,您可以执行以下操作。您可以先询问用户前缀,然后询问起始序列号。然后,您可以使用内置的printffrombash对数字进行正确的格式化,但您可能必须决定提供足够的数字宽度来容纳所有序列,因为这将导致名称更加同质。您可以使用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中。

于 2011-08-11T09:49:23.157 回答
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/*

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

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

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

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

于 2011-08-11T10:33:53.547 回答