텍스트 파일에서 행을 읽고 각 행의 각 이름에 대한 텍스트 파일 작성 이름은 별도의 줄에 있습니다. 나는이 텍스트 파일의 라인을

다음과 같은 텍스트 파일이 있다고 가정 해 봅시다.

john
george
james
stewert

모든 이름은 별도의 줄에 있습니다.

나는이 텍스트 파일의 라인을 읽고처럼, 각각의 이름에 대한 텍스트 파일을 만들려면 : john.txt, george.txt

Bash에서 어떻게 할 수 있습니까?



답변

# 1 배쉬 + 사용 touch:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in: 이것은 파일의 끝에 도달 할 때 발생하는 자체 반환 read할 때까지 실행됩니다 . 경로 재 지정 으로 인해 터미널 대신 현재 작업 디렉토리에 이름이 지정된 파일에서 입력을 읽습니다 .read1readin<in
  • touch "$line.txt"이 실행 touch의 확장 된 값에서 $line.txt의 함유량이다 line하였다 .txt; touch존재하지 않는 경우 파일을 작성하고 존재하는 경우 액세스 시간을 업데이트합니다.

사용 # 2 xargs+ touch:

xargs -a in -I name touch name.txt
  • -a in: 현재 작업 디렉토리에 xargs이름이 지정된 파일에서 입력을 읽습니다 in.
  • -I name: 다음 명령에서 xargs발생하는 모든 name현재 행을 대체합니다 .
  • touch name: touch대체 된 값인 name; 존재하지 않는 경우 파일을 작성하고 존재하는 경우 액세스 시간을 갱신합니다.
% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt  in  james.txt  john.txt  stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt  in  james.txt  john.txt  stewert.txt

답변

이 특정 경우, 한 줄에 하나의 단어 만있는 경우 다음을 수행 할 수도 있습니다.

xargs touch < file

파일 이름에 공백이 포함될 수 있으면이 오류가 발생합니다. 이러한 경우 대신 다음을 사용하십시오.

xargs -I {} touch {} < file

재미를 위해 여기에 공백이있는 줄을 포함하여 임의의 파일 이름을 처리 할 수있는 몇 가지 다른 방법이 있습니다.

  • perl -ne '`touch "$_"`' file
  • 어 wk

    awk '{printf "" > $0}' file 

Linux 및 유사한 시스템에서 확장은 대부분의 파일에 대해 선택 사항입니다. .txt텍스트 파일에 확장자를 추가 할 이유가 없습니다 . 당신은 자유롭게 할 수 있지만 전혀 차이가 없습니다. 따라서 확장을 원한다면 다음 중 하나를 사용하십시오.

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 

답변

이 작업에는 AWK도 적합합니다.

testerdir:$ awk '{system("touch "$0)}' filelist

testerdir:$ ls
filelist  george  james  john  stewert

testerdir:$ awk '{system("touch "$0".txt")}' filelist

testerdir:$ ls
filelist  george.txt  james.txt  john.txt  stewert.txt
george    james       john       stewert

다른 방법은 tee. 줄이 파일 목록에 둘 이상의 문자열을 포함하는 경우이 방법이 중단됩니다.

testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert

</dev/null tee $(cat filelist)파이핑을 피하려면 다른 방법 으로도 수행 할 수 있습니다.

cp /dev/null 접근 방식 (이것은 공백이 포함 된 파일 이름으로 작동합니다) :

testerdir:$ cat filelist | xargs -I {}  cp /dev/null  "{}"

testerdir:$ ls
filelist  FILE WITH SPACES  george  james  john  stewert

testerdir:$ ls FILE\ WITH\ SPACES
FILE WITH SPACES

답변

텍스트 파일이 있다고 가정 해 보겠습니다.

대답이 있습니다 .)

awk '{system("touch \""$0".txt\"")}' file

공간과 접미사로도 방수 처리 =)