50のディレクトリ(dir-01..dir-50)を作成しようとしています。 50個のディレクトリのそれぞれに50個のファイル(01.txt..50.txt)を作成したいと思います。
For example:
dir-01/01.txt..50.txt
dir-02/02.txt..50.txt
etc...
ディレクトリを作成できますが、各ディレクトリ内にファイルを作成する際に問題があります。また、これらすべてをtarファイルに圧縮してみました。
私が現在いるところは次のとおりです。
for i in {1..50};
do mkdir dir-$i;
done;
for j in {1..50};
do touch $j.txt.dir-*;
done;
tar -cf final.tar dir-{1..50}
2番目のループが間違っていることを知っていますが、進行方法がわかりません。どんな提案にも感謝します。
これはうまくいくようですが、正しい構文や形式があるかどうかはわかりません。
for i in {1..50}; do
mkdir "dir-$i";
for j in {1..50}; do
touch "./dir-$i/$j.txt";
done;
done;
tar -cf final.tar dir-{1..50}
答え1
そしてzsh
またはbash
またはyash -o braceexpand
:
$ mkdir dir-{01..50}
$ touch dir-{01..50}/file{01..50}.txt
$ ls dir-45
file01.txt file09.txt file17.txt file25.txt file33.txt file41.txt file49.txt
file02.txt file10.txt file18.txt file26.txt file34.txt file42.txt file50.txt
file03.txt file11.txt file19.txt file27.txt file35.txt file43.txt
file04.txt file12.txt file20.txt file28.txt file36.txt file44.txt
file05.txt file13.txt file21.txt file29.txt file37.txt file45.txt
file06.txt file14.txt file22.txt file30.txt file38.txt file46.txt
file07.txt file15.txt file23.txt file31.txt file39.txt file47.txt
file08.txt file16.txt file24.txt file32.txt file40.txt file48.txt
$ tar -cf archive.tar dir-{01..50}
そしてksh93
:
$ mkdir dir-{01..50%02d}
$ touch dir-{01..50%02d}/file{01..50%02d}.txt
$ tar -cf archive.tar dir-{01..50%02d}
中括弧ksh93
拡張は、printf()
ゼロで埋められた数値を作成するために使用できるスタイル形式の文字列を使用します。
POSIXの使用sh
:
i=0
while [ "$(( i += 1 ))" -le 50 ]; do
zi=$( printf '%02d' "$i" )
mkdir "dir-$zi"
j=0
while [ "$(( j += 1 ))" -le 50 ]; do
zj=$( printf '%02d' "$j" )
touch "dir-$zi/file$zj.txt"
done
done
tar -cf archive.tar dir-* # assuming only the folders we just created exists
tar
あまりにも多くのファイルを生成せずにアーカイブを生成する代替方法は次のとおりですbash
。
mkdir dir-01
touch dir-01/file{01..50}.txt
tar -cf archive.tar dir-01
for i in {02..50}; do
mv "dir-$(( i - 1 ))" "dir-$i"
tar -uf archive.tar "dir-$i"
done
これはディレクトリを作成し、それをアーカイブに追加するだけです。 50のディレクトリ内のすべてのファイルは名前と内容が同じであるため、そのディレクトリの名前を変更し、それを連続して繰り返しアーカイブに追加して、49の異なるディレクトリを追加します。
答え2
各ディレクトリに50個のファイルを作成します。
for i in {1..50}; do
mkdir dir$i
touch dir$i/file{1..50}
done
計算してみてくださいls -l dir*/* | nl
= 2500
答え3
POSIXlyは、50 x 50ファイルパスのリストがargs + envサイズ制限を超える可能性がある場合に問題を回避します。
awk 'BEGIN{for (i = 1; i <= 50; i++) printf "dir-%02d\n", i}' |
xargs mkdir &&
awk 'BEGIN{for (i = 1; i <= 50; i++)
for (j = 1; j <= 50; j++)
printf "dir-%02d/file-%02d.txt\n", i, j}' |
xargs touch
zsh
(どこ{01..50}
から来たのか)を使用すると、問題を解決できます。引数のリストが長すぎます。そしてzargs
:
autoload zargs
mkdir dir-{01..50}
zargs dir-{01..50}/file-{01..50}.txt -- touch
dir{02..50}
シンボリックリンクを作成dir-01
し、次のオプションを使用することもできますh
tar
。
mkdir dir-01
touch dir-01/file-{01..05}
for d in dir-{02..05}; do ln -s dir-01 "$f"; done
tar zchf file.tar.gz dir-{01..50}
答え4
私はこれがあなたが望むように行われると信じています。
for i in {1..50}; do mkdir $i.dir; cd $i.dir ; touch {1..50}.txt; cd ..; done; tar -cf dirs.tar *.dir; find . -type f | wc -l
説明する:
最初のループでは、bashは
mkdir $i.dir
1.dirという名前の[]ディレクトリを作成します。cd $i.dir
その後、1.dirディレクトリ[]に入ります。これにより、50個のファイルが生成されます。 50個のファイルを生成するには、以下を使用しました。支柱の拡張bash関数(forで使用する)の前には
touch
[touch {1..50}.txt
]が付きます。その後、現在のディレクトリ[]に戻り、
cd ..
ループ操作を開始します。ループ操作が完了すると、
tar
名前の末尾に.dirがあるディレクトリが表示されます。 [tar -cf dirs.tar *.dir
]。find
次に、[]コマンドを使用してfind -type f | wc -l
生成されたファイルの数を表示します。 2551 個のファイルが表示されます ("50*50=2550 +1" - 追加 1 個は .tar ファイルです)。
コマンドラインから直接使用するか、スクリプトとして使用できます。