linux - 按特定顺序重命名一组文件而不丢失它们(在 Linux 上)

标签 linux bash file-rename

我有一组文件(列表较大,4x43 文件,扩展名为 I.sto、Q.sto、U.sto 和 V.sto):

probni45069Q.sto probni45080I.sto probni45080V.sto probni45083U.sto 
probni45069U.sto probni45080Q.sto probni45083I.sto probni45083V.sto
probni45069I.sto probni45069V.sto probni45080U.sto probni45083Q.sto

我的目标是按照从数字 1 开始的排序顺序重命名它们:

  1. probni45069I.sto probni1I.sto
  2. probni45080I.sto probni2I.sto
  3. probni45083I.sto probni3I.sto
  4. probni45069Q.sto probni1Q.sto
  5. probni45080Q.sto probni2Q.sto
  6. probni45083Q.sto probni3Q.sto
  7. probni45069U.sto probni1U.sto
  8. probni45080U.sto probni2U.sto
  9. probni45083U.sto probni3U.sto
  10. probni45069V.sto probni1V.sto
  11. probni45080V.sto probni2V.sto
  12. probni45083V.sto probni3V.sto

我已遵循 Renaming files in a folder to sequential numbers 的说明和指南并创建了以下 bash 脚本:

model='probni'

for sto in I Q U V;
do
    i=1
    for j in $model*$sto.sto;
    do
        echo "$j" `printf $model%1d$sto.sto $i`
        mv "$j" `printf $model%1d$sto.sto $i` 2>/dev/null || true
        i=$((i + 1))
    done
done

此脚本仅使用一次时效果很好。问题是,当我在已排序的文件集上多次使用它时,或者当我有一组已排序的文件以及其他未排序的文件(例如 probni1I.sto + probni1346I.sto)时,我会丢失一定数量的文件。当在我原来的 4x43 文件集上重复使用时,我最终以 4x7 文件集结束。

我的问题是如何使此脚本对于排序文件具有幂等性,或者如何将新的未排序文件添加到排序列表而不丢失任何文件。

最佳答案

问题是文件名按字典顺序排序,这会导致数字问题,因为 1 2 1346 将被排序为 1 1346 2,因为字符 1 位于 2 之前。您需要更智能的排序来更直观地处理数字。

sort -g 正是医生所吩咐的。通过 sort -g 过滤文件列表,1346 不会再给您带来任何麻烦。

for j in $(ls $model*$sto.sto | sort -g); do
    ...
done

通常parsing the output of ls is a bad idea 。如果你想做真正正确的事情,你需要稍微重组一下。

for sto in I Q U V; do
    find -maxdepth 1 -name "$model*$sto.sto" -print0 |
        sort --files0-from - -z |
    {
        i=1
        while IFS= read -rd $'\0' old; do
            new=$model$i$sto.sto
            [[ $old == $new ]] && continue
            echo "$old" "$new"
            mv -- "$old" "$new" 2>/dev/null || true
            ((i++))
        done
    }
done

这是一项艰巨的工作,但这个版本可以更好地处理奇怪的文件名。它在所有阶段都使用 NUL 分隔符,因此带有空格和换行符的文件名不会破坏工作。

我不希望你有这样奇怪的文件,但是嘿,安全总比后悔好。尝试做正确的事总是好的。

关于linux - 按特定顺序重命名一组文件而不丢失它们(在 Linux 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038944/

相关文章:

c# - 为什么我只在红隼上得到 500?

perl - 冒号和逗号之间的 Grep 数字

php - 两次使用不同的名称上传图像 php mysql

c - 如果 malloc 通过 gdb 返回 NULL,如何设置条件断点

linux - 我可以在 Linux 中混合文本和二进制文件吗?

Linux内核源代码修改和重新编译

Bash 变量替换和字符串

git - 将所有参数传递给 git 别名

ios - 如何在 iOS 中以编程方式重命名文档文件夹中的文件/文件夹

Python 程序重命名文件名,如果已经存在该文件则覆盖