我有一组文件(列表较大,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 开始的排序顺序重命名它们:
- probni45069I.sto probni1I.sto
- probni45080I.sto probni2I.sto
- probni45083I.sto probni3I.sto
- probni45069Q.sto probni1Q.sto
- probni45080Q.sto probni2Q.sto
- probni45083Q.sto probni3Q.sto
- probni45069U.sto probni1U.sto
- probni45080U.sto probni2U.sto
- probni45083U.sto probni3U.sto
- probni45069V.sto probni1V.sto
- probni45080V.sto probni2V.sto
- 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/