디렉터리 목록 만들기

디렉터리 목록 만들기

텍스트 파일에 이름 목록이 있습니다. ( list.txt) 해당 파일에 포함된 이름에 대한 폴더 목록을 만들고 싶습니다. 다음 스크립트를 작성했지만 작동하지 않으며 무엇이 잘못되었는지 모르겠습니다.

#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}

파일 list.txt과 스크립트는 같은 폴더에 있습니다.

답변1

이것은 나에게 효과적이었습니다.

xargs mkdir <list.txt

이는 여러 인수를 제공하면 mkdir생성할 수 있는 모든 디렉터리를 행복하게 생성하기 때문에 작동합니다. xargs줄 바꿈을 공백으로 대체하여 텍스트 파일을 "평탄화"하면 mkdir한 번에 하나씩이 아니라 모든 디렉터리 이름이 포함된 긴 인수 목록이 호출됩니다.

고정 접두사(또는 접미사 또는 둘 다)를 추가하려는 경우:

xargs -I, mkdir prefix_, <list.txt

스위치 뒤에 입력하는 내용 -I(이 경우 쉼표)은 파일에서 읽은 이름으로 대체됩니다.

한 가지 더, 텍스트 파일의 파일 이름에 공백이나 다른 "특수" 문자가 있는 경우를 대비해 따옴표를 추가하겠습니다.

xargs -I, mkdir "," <list.txt

또는

xargs -I, mkdir "prefix_," <list.txt

답변2

귀하의 예에서는 혼란스러운 쉘 스크립팅 명령입니다. 사용 중인 스크립팅 언어에 특별한 주의를 기울인 다음 해당 명령의 구문을 준수해야 합니다. 귀하의 예에서는 터보 C 쉘(tcsh)을 사용하고 있지만 Bash/Bourne 쉘 명령과 구문을 혼합하고 있습니다.

정말로 원한다면 다음 접근 방식을 사용할 수 있습니다 tcsh. 다음 샘플 파일이 있다고 가정해 보겠습니다.

$ cat afile 
1
2
3
4
5

그리고 이 스크립트는:

$ cat cmd.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "$i" 
end

이를 실행하면 다음과 같은 출력이 생성됩니다.

$ ./cmd.csh
1
2
3
4
5

mkdir따라서 작업을 완료하려면 다음 명령을 추가하면 됩니다 echo.

$ cat cmd1.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "making directory: $i" 
  mkdir "$i"
end

이제 실행하면:

$ ./cmd1.csh 
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5

결과적으로 디렉터리가 생성됩니다.

$ ls -l
total 32
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 1
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 2
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 3
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 4
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 5
-rw-rw-r--. 1 saml saml   11 Oct 16 18:47 afile
-rwxrwxr-x. 1 saml saml   86 Oct 16 18:56 cmd1.csh
-rwxrwxr-x. 1 saml saml   55 Oct 16 18:51 cmd.csh

답변3

GNU Parallel이 있으면 다음을 수행할 수 있습니다.

parallel -q mkdir '<name_id>'{} < list.txt 

반대 xargs는 <, >, ', " 및 공백과 같은 특수 문자를 올바르게 처리합니다.

GNU Parallel은 일반적인 병렬 처리기이며 동일한 시스템 또는 SSH 액세스 권한이 있는 여러 시스템에서 작업을 병렬로 쉽게 실행할 수 있도록 해줍니다.

설치

GNU Parallel이 배포용으로 패키지되어 있지 않은 경우 루트 액세스가 필요하지 않은 개인 설치를 수행할 수 있습니다. 다음과 같이 하면 10초 안에 완료할 수 있습니다.

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README

더 알아보기

더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html

소개 동영상 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html

지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel

답변4

루프가 필요하지 않습니다. 넌 할 수있어:

mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`

관련 정보