名前が数字で始まるディレクトリで最高の数字のファイル名を見つけます
質問
このように見えるファイルを備えたディレクトリがあります。
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を1つずつ増やしてから、その番号を使用して新しいファイル名を生成したいと思います。バッシュでそれをするにはどうすればよいですか?
解決
$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever
だから、それはバッシュ固有です。以下はaです 任意のposix-shell-including-bash 解決策、より簡単なことが可能だと思います。
$ 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
最初のステートメントは、-1オプションを備えた1つのライナーとしてMyDirのファイルを出力します。これは、-Hで人間の数値で並べ替えるソート関数にパイプされ、reverse順序(最初の最高数)が-rで並べ替えられます。これは、-nのトップのほとんどの結果を配信するだけのヘッド関数にパイプされます(例の1つ)。答えは、人間の数値並べ替え順序、つまり221が67を超えることを考慮しています。これは非常に互換性が高いPOSIXシェルソリューションです。
これが解決策です(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