각 줄에 디렉터리를 지정하는 텍스트 파일 "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
xargs
mkdir
가능한 한 적은 수의 명령을 실행합니다 .
표준 구문을 사용하십시오.
(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
그러면 현재 작업 디렉터리에 디렉터리/디렉토리 트리가 생성됩니다. 일괄적으로 생성하는 대신(모든 디렉터리를 동시에 생성하는 것과 같이) 차례로 생성합니다.