파일에 지정된 디렉터리 목록을 만드는 가장 빠른 방법은 무엇입니까?

파일에 지정된 디렉터리 목록을 만드는 가장 빠른 방법은 무엇입니까?

각 줄에 디렉터리를 지정하는 텍스트 파일 "foo.txt"가 있습니다.

data/bar/foo
data/bar/foo/chum
data/bar/chum/foo
...

잠재적으로 수백만 개의 디렉터리와 하위 디렉터리가 있습니다. 터미널 명령을 사용하여 모든 디렉터리와 하위 디렉터리를 일괄 생성하는 가장 빠른 방법은 무엇입니까?

가장 빠르다는 것은 모든 디렉토리를 생성하는 것이 가장 빠르다는 것을 의미합니다. 수백만 개의 디렉터리가 있으므로 쓰기 작업도 많습니다.

우분투 12.04를 사용하고 있습니다.

편집: 각각 디렉터리를 나타내는 수백만 개의 행이 있으므로 이 목록은 메모리에 맞지 않을 수 있습니다.

편집: 내 파일에는 450만 줄이 있습니다. 각 줄은 디렉터리를 나타내며 영숫자 문자, 경로 구분 기호 "/" 및 "../"로 구성됩니다.

xargs -d '\n' mkdir -p < foo.txt잠시 동안 실행하면 Ctrl+C를 실행할 때까지 인쇄 오류가 계속 발생합니다.

mkdir: '../myData/data/a/m/e/d' 디렉토리를 생성할 수 없습니다: 장치에 남은 공간이 없습니다

그러나 실행하면 df -h다음과 같은 결과가 나타납니다.

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda        48G   20G   28G  42% /
devtmpfs        2.0G  4.0K  2.0G   1% /dev
none            401M  164K  401M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm

자유-m

 total       used       free     shared    buffers     cached
Mem:          4002       3743        258          0       2870         13
-/+ buffers/cache:        859       3143
Swap:          255         26        229

편집: df-i

Filesystem      Inodes   IUsed  IFree IUse% Mounted on
/dev/xvda      2872640 1878464 994176   66% /
devtmpfs        512053    1388 510665    1% /dev
none            512347     775 511572    1% /run
none            512347       1 512346    1% /run/lock
none            512347       1 512346    1% /run/shm

df-T

Filesystem     Type     1K-blocks     Used Available Use% Mounted on
/dev/xvda      ext4      49315312 11447636  37350680  24% /
devtmpfs       devtmpfs   2048212        4   2048208   1% /dev
none           tmpfs       409880      164    409716   1% /run
none           tmpfs         5120        0      5120   0% /run/lock
none           tmpfs      2049388        0   2049388   0% /run/shm

편집: inode 수를 늘리고 디렉터리 깊이를 줄였는데 이것이 작동하는 것 같습니다. 이번에는 2분 16초가 걸렸습니다.

답변1

GNU 사용 xargs:

xargs -d '\n' mkdir -p -- < foo.txt

xargsmkdir가능한 한 적은 수의 명령을 실행합니다 .

표준 구문을 사용하십시오.

(export LC_ALL=C
 sed 's/[[:blank:]"\'\'']/\\&/g' < foo.txt | xargs mkdir -p --)

비효율성은 사전에 존재하더라도 일부 가능 하고 동일한 작업이 mkdir -p a/b/c시도된다는 것입니다.mkdir("a")stat("a")chdir("a")"a/b""a/b"

당신이 foo.txt가지고 있다면:

a
a/b
a/b/c

이 순서대로, 즉 각 경로에 대해 이전의 각 경로 구성 요소에 대한 행이 있는 경우 이를 생략할 수 있으며 -p훨씬 더 효율적입니다. 또는:

perl -lne 'mkdir $_ or warn "$_: $!\n"' < foo.txt

이렇게 하면 (많은) mkdir명령을 완전히 호출하는 것을 방지할 수 있습니다.

답변2

나는 우리가 이 질문에 대해 많은 답을 얻게 될 것이라는 것을 알고 있습니다. 하지만 넌 아직 할 수 있어노력하다이것:) :D

while read -r line; do mkdir -p "$line" ; done < file.txt

답변3

다음 한 줄을 시도해 보세요.

for i in $(cat foo.txt) ; do mkdir -p $i ; done

그러면 현재 작업 디렉터리에 디렉터리/디렉토리 트리가 생성됩니다. 일괄적으로 생성하는 대신(모든 디렉터리를 동시에 생성하는 것과 같이) 차례로 생성합니다.

관련 정보