私のホームディレクトリに「A」というディレクトリを作成したいのですが、そのようなディレクトリがすでに存在するかどうかわかりません。ディレクトリが存在しない場合は、ディレクトリを生成するコマンドを作成したいと思います。ただし、ディレクトリが存在する場合、コマンドは同じ名前の新しいディレクトリを作成し、ディレクトリ名を変更するための小さな追加エントリを追加します。小さな追加はランダムでなければなりません。つまり、コマンドを実行するたびに別の追加を受け取ります。たとえば、このコマンドは「A15」または「A7」ディレクトリまたは「A」の代わりにこれらの追加ディレクトリを作成します。追加された新しいディレクトリが存在しないと想定できます。このコマンドは、元のディレクトリ「A」が存在せず、正常に作成された場合は!DONEメッセージを印刷するか、「ディレクトリ存在」メッセージを印刷します。新しい名前 A05 が作成されました。ここで、A05 は新しい名前です。
答え1
bash
「スクリプトなし」は、一連のコマンドまたは便利なシェル機能を使用することを意味すると仮定します。便利なシェル機能をお知らせします。
この関数は、指定された名前でディレクトリを作成しようとし、ディレクトリがエラーなしで生成されるまで、別の数値サフィックスを使用して再試行します。数値インデックスは、1から99までの順序でテストされます。数値範囲を超えると診断メッセージが出力され、ディレクトリは生成されません。ディレクトリが作成されると、そのパス名が標準出力に書き込まれます。
makedir () {
local name="$1"
local suffix=
until mkdir -- "$name$suffix" 2>/dev/null; do
suffix=$(( suffix + 1 ))
if [ "$suffix" -eq 100 ]; then
echo 'Cannot create directory' >&2
return 1
fi
done
printf '%s\n' "$name$suffix"
}
これはコマンドが成功するuntil
まで繰り返し使用されます。カウンタが100に達するmkdir
と、エラーストリームにメッセージが出力され、関数はゼロ以外の終了ステータスを返します。suffix
この関数定義は通常、エイリアスを追加する場所に追加できます。これにより、次のシェルセッションで使用できます。
1〜99の範囲で単調に増加する数字の代わりに乱数が必要な場合:
makedir () {
local name="$1"
local tries=0
local suffix=
until mkdir -- "$name$suffix" 2>/dev/null; do
tries=$(( tries + 1 ))
if [ "$tries" -eq 100 ]; then
echo 'Cannot create directory' >&2
return 1
fi
suffix=$RANDOM
done
printf '%s\n' "$name$suffix"
}
これはほぼ$RANDOM
同じ機能ですが、整数になるサフィックスとして使用されます。以前と同様に、関数が100回の試行以内にディレクトリを作成できない場合は終了します。
これが一時ディレクトリを作成する場合は、mktemp -d
一部のホームブレンドエントリの代わりに使用することをお勧めします。デフォルトでは、次のディレクトリの名前が提供されます/tmp
。
tmpdir=$( mktemp -d )
# Do some work beneath "$tmpdir".
# Then...
rm -r "$tmpdir"