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

그리고 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()0으로 채워진 숫자를 만드는 데 사용할 수 있는 - 스타일 형식 문자열을 사용합니다.


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

설명하다:


  1. 첫 번째 루프에서 bash는 mkdir $i.dir1.dir이라는 이름의 [ ] 디렉터리를 생성합니다.

  2. cd $i.dir그런 다음 1.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 파일임).

명령줄에서 직접 사용하거나 스크립트로 사용할 수 있습니다.

관련 정보