我在一个名为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!
有没有更好的方法来执行此操作而不会丢失文件的原始顺序?
答案 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
。