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