「abcdefg_y_zz.jpg」のような名前のファイルがいくつかあります。「abcdefg」は一連の数字で、「y」と「zz」は文字です。10 より大きい数字で終わる一連の数字を持つすべてのファイルを取得する必要があります。「fg」が 10 より大きいファイルです。
誰かがbashスクリプトでそれを行う方法について考えを持っていますか?
わかりました、技術的には、すべての情報に基づいて...
ls | grep '[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg'
これはどう?位置 f に 0 があるものを除外するだけです。
ls -1 | grep -v "?????0?_?_??.jpg"
更新 >= 10ではなく> 10が必要なため、10も除外する必要があります。だからこれをしてください:
ls -1 | grep -v "?????0*_?_??.jpg" | grep -v "??????10_?_??.jpg"
ファイル名に順番に名前が付けられている場合、このawk
ソリューションは機能します。
ls | awk 'BEGIN { FIELDWIDTHS = "5 2" } $2 > 10'
FIELDWIDTHS = "5 2"
$1
これは、最初の5文字と$2
次の2文字を参照することを意味します。$2 > 10
フィールド2が10より大きい場合に一致し、デフォルトのコードブロックを暗黙的に呼び出します。'{ print }'
たった1つのプロセス:
ls ?????+(1[1-9]|[2-9]?)_?_??.jpg
より多くのスクリプトで
#!/bin/bash
for i in seq FIRST INCREMENT LAST
do
cp abcde$i_y_zz.jpg /your_new_dir //or whatever you want to do with those files
done
あなたの例では、seqの行は次のようになります
for i in seq 11 1 100000000
これまでに提供されたすべてのソリューションは問題ありませんが、シェル プログラミングの経験がある人なら誰でも、構文解析ls
は決して良い考えではなく、避ける必要があることを知っています。これは実際にはこの場合には当てはまりません。ファイルの名前が特定のパターンに従っていると想定できますが、これは覚えておくべき規則です。詳細はこちら。
あなたが望むことは、GNUでより安全に達成できますfind
-ファイルがあるディレクトリでコマンドを実行すると仮定すると、次のようになります。
find . -regextype posix-egrep -regex '\./[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg$'