mkdirにdir1を作成するように指示し、既に存在する場合はdir2を作成し、存在しない名前に到達するまでどうすればよいですか?


13

「dir1」などの末尾に番号を付けてディレクトリを作成し、存在しないディレクトリ名が見つかるまでディレクトリが既に存在する場合はその番号を増やして、1行でこれを行う必要があります。 Linuxコマンドライン、次のようなもの:

mkdir --increment dir$

それをどうやってやるの?

これまでのところ、私はこれを持っています:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

しかし、それは次のディレクトリ名をエコーするだけで、コマンドを再帰的に実行するために必要です。

回答:


26

これは、次の使用法に関する簡単な演習ですwhile

n = 0
ながら!mkdir dir $ n
行う
    n = $((n + 1))
やった

しかし、もちろん、この些細なメカニズムがうまくスケールしないことを理解することはあまり考えません。

そのため、ホイールを再発明してすべてのコーナーを再度削る必要がなく、テンプレートから一意の一時ディレクトリをわずかに作成します。

name = $(mktemp -d dirXXXXXXXXXXX)


数値のバイナリ検索で十分な場合があります。
トールビョーンラヴンアンデルセン14

ホイールの再発明プロセスを開始する場所から削り落とすコーナーはかなりありますが、少なくともその一部は、ファイルシステムを記憶し、セキュリティと並列化を考慮しています。
JdeBP 14

6

正しい順序でリストされているディレクトリをインクリメンタルに作成する場合、代わりに現在の日付に基づいて名前が付けられたフォルダーを推奨できますか?

DATE=$(date +%F)
mkdir "dir-$DATE"

dir-2014-03-02YYYY-MM-DDなどの名前のディレクトリを作成し、アルファベット順に表示します)。

1日に複数のディレクトリを作成する場合、現在の時刻をファイル名に追加できます。man dateの出力フォーマットを調整する方法を参照してくださいdate


5

最初に「最大の」ディレクトリ名を見つけ、番号を取得して次の値を増やします。

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

これは良い考えですが、簡単に比較することはできません。
トールビョーンラヴンアンデルセン14

数百万のディレクトリがない限り、並列化は間違いなく時期尚早な最適化です。
グレンジャックマン14

なぜprintfここが必要なのですか?簡単なecho仕事ではありませんか?
ルスラン

また、のdir[0-9]*代わりに使用しますdir*
ルスラン14

1
あなたは誤解している。スクリプトが一度に複数回(複数のスレッド、複数のユーザーなど)実行されるのが賢明かどうかについて話します。
トールビョーンラヴンアンデルセン

2

ディレクトリが常に「dir1」で始まり、$ dir *という名前のファイルがないと仮定すると(つまり、すべて順番に番号が付けられたディレクトリです)、この1つのライナーで逃げることができます-

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

これは、$ dirで始まるファイルの数をカウントし、その数に1を追加して新しいファイルを作成します。


0

他の回答への補遺:名前でディレクトリを正しくソートする必要がある場合は、新しいディレクトリ番号(NUM)の先頭にゼロを追加して固定長にすることもできます。

以下は、1行に凝縮するか、他のソリューションの1つに埋め込むことができます。

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

これは、NUMが少なくとも1桁の長さで始まり、固定長を超えないことを前提としています。要件に応じて調整してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.