题
我的目录中有一个看起来像这样的文件:
001_something.php 002_something_else.php
004_xyz.php 005_do_good_to_others.php
我最终想创建一个新的空的PHP文件,其名称从系列中的下一个数字开始。
LIST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | tr '\n' ' '`
前面的代码为我提供了这样的字符串:
LIST='001 002 004 005 '
我想抓住005,增加一个,然后使用该数字生成新的文件名。我该如何在狂欢中做到这一点?
解决方案
$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever
因此,这是特定的。以下是 任何固定壳,包括弹药 解决方案,我想这是可能的。
$ cat /tmp/z
f () {
eval echo \${$#} | sed -e 's/^0*//'
}
LIST='001 002 004 005 '
newname=`printf %03d-whatever $(($(f $LIST) + 1))`
echo $newname
$ sh /tmp/z
006-whatever
$
其他提示
您需要整个列表吗?
如果不
LAST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`
只会给您005零件,
printf "%03d" `expr 1 + $LAST`
将在序列中打印下一个数字。
仅使用标准工具,以下将为您提供新文件的前缀(006):
ls [0-9]* | sed 's/_/ _/' | sort -rn | awk '{printf "%03d", $1 + 1; exit}'
这似乎更简单。
ls [0-9]* | sort -rn | awk '{FS="_"; printf "%03d_new_file.php\n",$1+1;exit}'
快速,无壳和无环(还带有空格的文件名)*:
list=([0-9]*)
last=${list[@]: -1}
nextnum=00$((10#${last%%[^0-9]*} + 1))
nextnum=${nextnum: -3}
touch ${nextnum}_a_new_file.php
鉴于您的示例文件,输出将是:
006_a_new_file.php
$ for file in *php; do last=${file%%_*} ; done
$ newfilename="test.php"
$ printf "%03d_%s" $((last+1)) $newfilename
006_test.php
我留给你做新文件的创建
touch "newfile_$(printf "%03d" $(echo $(ls 00?_*.php|sed 's/_.*//'|sort -rn|head -1)+1|bc))"
2.
num=$(ls 00?*.php | sed's/.*//'|sort -rn|head -1) touch $(printf "newfile_%03d" $((num+1)))
我发布此答案,以最小化解决核心问题的解决方案:“在名称以数字开头的目录中找到最高编号的文件名”:
ls -1 "$MyDir" | sort -hr | head -n 1
第一个语句将MyDir中的文件作为一个带有-1选项的衬里。这是将以-H和相反顺序(最高数字)与-r分类的排序函数。将其管道到头部函数,该功能仅提供-n最高结果(示例中的1个)。答案认为人数排序顺序IE 221高于67。它是一种非常兼容的posix shell解决方案。
这是一个解决方案(您需要BC):
#!/bin/bash
LIST='001 002 008 005 004 002 '
a=0
for f in $LIST
do
t=$(echo $f + 1|bc)
if [ $t -ge $a ]
then
a=$t
fi
done
printf "%03d\n" $a
不隶属于 StackOverflow