当缺少某些文件时,将文件重命名为顺序

时间:2016-03-16 20:07:54

标签: bash

我在一个名为1.jpg,2.jpg,4.jpg,5.jpg,8.jpg,9.jpg的文件夹中有一堆jpg文件,并希望重命名它们以消除顺序中的间隙但保持它们的顺序相同。

我试过了:

REORDER=1
for f in *.jpg
do
  printf "Moving "$f"\n"
  mv -n "$f" "$(date -r "$f" +"$REORDER").jpg"
  printf "Moved to "$REORDER"\n"
  ((REORDER++))
done

但这似乎是行为不端,并开始做一些奇怪的事情,比如循环并重新命名1.jpg!

有没有更好的方法来执行此操作而不会丢失文件的原始顺序?

3 个答案:

答案 0 :(得分:1)

您可以对所有文件进行数字排序,然后逐个阅读并重命名:

declare -i index=1
while IFS= read -r -d '' file; do
    mv "$file" "$index.jpg"
    index=index+1
done< <(find -type f -printf '%f\0' | sort -zn)

答案 1 :(得分:1)

请注意,如果文件名中有换行符,则以下内容可能会失败。

a=( *.jpg ) IFS=$'\n' a=( $(sort -n <<<"${a[*]}") )
for i in "${!a[@]}"; do mv -v "${a[$i]}" "$((i+1)).jpg"; done

首先构建并排序文件数组。 然后它遍历该数组(其第一个索引为零)并重命名每个文件以包含索引加一。

它依赖于bash非关联数组维持索引顺序的事实。

答案 2 :(得分:0)

如果您的文件名包含嵌入的空格,请不要使用此答案。否则它会正常工作。

我不确定你的脚本对date的调用是什么意思,但这个脚本对我有用:

#!/bin/bash

REORDER=1

find . -name '*.jpg' -printf "%f\n" | sort -n | while read f
do
        DEST="$REORDER.jpg"
        if [ "$DEST" != "$f" ]
        then
                mv "$f" "$DEST"
        fi
        ((REORDER++))
done

并非您必须使用find,因为您需要以数字方式对输出进行排序。如果您不这样做,则会在7.jpg之后处理79.jpg