シェルスクリプトからファイルを生成する[閉じる]

シェルスクリプトからファイルを生成する[閉じる]

Test1YYYYMMDDHHMM1.txt、、、、 ... Test1YYYYMMDDHHMM2.txtTest1YYYYMMDDHHMM3.txt形式で100個のファイルを生成する方法はTest1YYYYMMDDHHMM100.txt?ファイルはシェルスクリプトの変数ディレクトリに書き込まれます。

答え1

YYYYMMDDHHMM現在の年、月、日、時、分でなければならないと仮定し、必要なファイルを移植可能に生成するには、シェルでループを使用できます。

#!/bin/sh

destdir=${1:-.}

cd "$destdir" || exit 1

now=$( date +%Y%m%d%H%M )

i=0
while [ "$i" -lt 100 ]; do
    i=$(( i + 1 ))
    touch "Test1$now$i.txt"
done

cd "$destdir" || exit 1現在のディレクトリをディレクトリパス$destdirで参照されているディレクトリに変更するか、それが可能でない場合はスクリプトを終了します。このdestdir変数は、スクリプトコマンドラインの最初の引数または引数が指定されていない場合、.現在のディレクトリから値を取得します。その中にファイルを作成するには、~/somedirこのスクリプトを./script ~/somedir

now必要なタイムスタンプの文字列表現で値を設定することから始めます。その後、100回繰り返し、touchタイムスタンプとカウンタ変数と一緒にコマンドを使用してファイルを生成しますi


シェルでは、bash上記のループを中括弧拡張で置き換えることができます。これは、生成されたコマンドラインの全長が長すぎない限り可能です。長すぎると(100ファイルではない)、「パラメータリストが多すぎます」というエラーが発生し、上記のループと同様の方法を使用する必要があります。

%(...)Tユーティリティを呼び出す代わりに、組み込みユーティリティと一緒に特殊な書式文字列を使用することもできます。これにはバージョン4.2以降が必要です。printfbashdatebash

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

touch "Test1$now"{1..100}.txt

作成する必要がある場合数千ファイルにある場合、上記のコードではこれを行うことはできません。本当に気に入らないループ(または読み取り不可能でメンテナンスできないコードを書くのと同じ)の場合は、このxargsコマンドが役に立ちます。

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

printf 'Test1%s.txt\n' "$now"{1..100} | xargs touch

これにより、パラメータを読み取り(一度にすべてではなく)管理可能なバッチでファイルを生成するユーティリティがtouch呼び出されます。組み込みユーティリティなので、すべてのファイル名でユーティリティを呼び出すのに問題はありません。xargsprintfprintfprintf


シェルでzsh変わりたい場合は、次のことを実行できます。

#!/bin/zsh

destdir=${1:-.}

cd $destdir || exit 1

zmodload zsh/datetime

strftime -s now %Y%m%d%H%M

i=0
repeat 100 touch Test1$now$((++i)).txt

明らかに一般的な中括弧拡張を使用することもできますが、zsh上記はzshsループを使用する方法repeatの単純化されたバリエーションを示しています。

答え2

mkdir Test1$(date +%Y%m%d%H%M){1..100}
touch Test1$(date +%Y%m%d%H%M){1..100}.txt

これにより、100のディレクトリが作成され、マンページで日付を確認し、bashで中括弧の拡張を確認します。これがあなたがここで働くものです。

このtouchコマンドは同じことを行いますが、ファイルを生成します。

これらのアイデアはbashのさまざまなコマンドに使用でき、さまざまな方法で作業できるため、実際に学び理解するのに時間を費やす必要があります。

関連情報