디렉토리 목록 생성

디렉토리 목록 생성

텍스트 파일( )에 이름 목록이 있고 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

귀하의 예에서 쉘 스크립트 명령은 혼란스럽습니다. 사용하는 스크립팅 언어에 특별한 주의를 기울인 다음 해당 명령의 구문을 준수해야 합니다. 귀하의 예에서는 Turbo 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`

관련 정보