创建 50 个目录,其中包含 50 个文件

创建 50 个目录,其中包含 50 个文件

我正在尝试创建 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}

我知道第二个循环是错误的,但我不确定如何继续。任何建议表示赞赏。

这似乎有效,但我不确定它的语法或格式是否正确:

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

zshbashyash -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(where {01..50}comes from),您可以解决arg 列表太长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

解释:


  1. 在第一个循环中,bash 将创建一个名为 1.dir 的目录 [ mkdir $i.dir]。

  2. 然后就会进入到1.dir目录下[ cd $i.dir]

  3. 然后它将创建 50 个文件。为了创建 50 个文件,我使用了大括号扩展bash 的功能(正如您在 for 中使用的那样)带有touch[ touch {1..50}.txt]。

  4. 然后它将返回当前目录[ cd ..]并开始循环工作。

  5. 完成循环工作后,它将显示tar名称末尾带有 .dir 的目录。 [ tar -cf dirs.tar *.dir]。

  6. 然后我使用find命令 [ find -type f | wc -l] 显示创建了多少文件。您将看到 2551 个文件(“50*50=2550 +1” - 额外的 1 是您的 .tar 文件)。

您可以直接在命令行上使用它,也可以将其用作脚本。

相关内容