셸에서 일련의 파일로 출력하는 가장 간단한 솔루션

셸에서 일련의 파일로 출력하는 가장 간단한 솔루션

다음과 같은 일련의 파일을 만들 수 있습니다.

touch file{A..Z}.txt 

그렇다면 출력을 이 범위로 보내는 가장 간단한 솔루션은 무엇입니까?

예 : echo 'hello, world'.{A..Z}

답변1

이 명령을 사용하여 파일을 생성하는 경우:

touch file{A..Z}.txt

동일한 확장자를 사용하여 동일한 텍스트를 동일하게 작성하고 생성할 수 있습니다.

echo hello, world | tee file{A..Z}.txt

tee명령은 또한 다음과 같이 씁니다.표준 출력, 따라서 터미널에 작성된 사본도 받게 됩니다. /dev/null필요하지 않은 경우 다음으로 리디렉션하세요.

echo hello, world | tee file{A..Z}.txt >/dev/null

달리기man tee로컬 시스템의 명령에 대한 정보를 가져옵니다. 예를 들어, 이 -a플래그는 파일 세트에 텍스트를 추가합니다.

bash대부분의 경우 확장 자체는 셸에 의해 실행됩니다. 바라보다man bash더 알아보기.

답변2

존재하다 zsh:

echo new test > file{A..Z}.txt

이는 multios옵션이 비활성화되지 않았다고 가정합니다.

실제로 fd가 쓰기를 위해 여러 번 리디렉션되면( , , , >리디렉션 >>연산자를 사용 1<>하지만 이 역시 적용됩니다 ...) 파이프로 리디렉션되고 , 파이프의 다른 쪽 끝에는 배경 zsh가 있습니다. 유사한 방식으로 모든 대상에 데이터를 보내는 프로세스입니다 .>!>||zshzshtee

옵션 noclobber이 켜져 있고 fileK.txt예를 들어 이미 존재하는 경우 리디렉션이 중단되고 해당 명령을 여는 동안 명령이 실행되지 않으므로 fileK.txt삭제되지 않지만 열리게 fileA.txt됩니다 fileJ.txt(0 크기로 생성됩니다).

이러한 파일은 모두 동시에 열리므로 tee너무 많은 파일로 리디렉션하면 열린 파일 설명자 수 제한에 도달하게 됩니다.

$ echo test > file{A..Z}{A..Z}{A..Z}.txt
zsh: multio failed for fd 3: too many open files
$ echo test | tee file{A..Z}{A..Z}{A..Z}.txt
tee: fileBNH.txt: Too many open files
tee: fileBNI.txt: Too many open files
tee: fileBNJ.txt: Too many open files
[...]
tee: fileZZZ.txt: Too many open files
test

여기서 이와 같은 명령을 사용하면 echo실행 비용이 거의 들지 않으며(비슷한 동작에 필요한 파이프를 생성하고 이를 통해 데이터를 푸시하는 오버헤드보다 적음 tee) 병렬 대신 직렬로 파일을 열고, 채우고, 닫을 수 있습니다. 파일 로 echo:

for f (file{A..Z}.txt) echo new test > $f

답변3

파일을 이미 생성했고 새 텍스트만 추가하려는 경우 -a 옵션과 함께 tee 명령을 사용할 수 있습니다.

echo "new text" | tee -a file{A..Z}.txt

파일 내용(예: file0)을 파일에 추가하려면:

<file0 tee -a file{A..Z}.txt

관련 정보