답변:
간단한 명령 대체를 사용하여 파일 이름을 가져 오지 마십시오 (공백 및 기타 특수 문자로 쉽게 구분할 수 있음). 다음과 같은 것을 사용하십시오 xargs
:
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
또는 while read
루프 :
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
명령 대체를 안전하게 사용하려면 최소한 IFS
줄 바꿈으로 설정하고 글 로빙 비활성화 (와일드 카드 확장) :
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
주변 괄호 ()
는 이것을 서브 쉘에서 실행하여 현재 쉘이 이러한 변경의 영향을받지 않도록합니다.
빠르고 더러운 방법 ...
cat $(cat list_of_files.txt) >> all_compounds.sdf
참고 : 목록의 파일 이름이 잘 작동하는 경우에만 작동합니다. 공백, 줄 바꿈 또는 쉘에 특별한 의미가있는 문자가 있으면 문제가 발생 합니다. 신뢰할 수있는 결과를 얻으려면 대신이 대답을 사용 하십시오 )
cat
사기꾼 고양이 파일을 enates. 또한 내용을 인쇄합니다.command2 $(command1)
를 사용 하면 파일을 연결하는 ( ) 의 출력을 command1
( cat list...
)로 전달할 수 있습니다.command2
cat
그런 다음 리디렉션 >>
을 사용 하여 stdout으로 인쇄하는 대신 출력을 파일로 보냅니다. 출력을 보려면 tee
대신 사용하십시오 .
cat $(cat list_of_files.txt) | tee -a all_compounds.sdf
( 파일이 이미있는 경우 스위치 >>
대신 >
및 스위치 와 tee
함께 사용 했습니다. -a
이미 파일이 있으면 덮어 쓰지 않고 파일에 추가 합니다)
cat
전체 목록을 하나의 인수로 가져옵니다.
GNU awk
는 텍스트 처리 유틸리티이지만 system()
호출을 통해 외부 쉘 명령을 실행할 수 있습니다 . 우리는 다음과 같이 이점을 활용할 수 있습니다.
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
여기서 아이디어는 간단합니다. 파일을 한 줄씩 읽고 각 줄에서 형식화 된 string을 cat "File name.txt"
만든 다음에 전달합니다 system()
.
그리고 여기에 작동합니다 :
$ ls
file1.txt file2.txt file3 with space.txt file_list.txt
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
Hi, I'm file2
Hi, I'm file1
Hi, I'm file3
그래서 우리는 이미 작업의 큰 부분을 수행했습니다. 목록에 모든 파일을 인쇄했습니다. 나머지는 간단합니다. 최종 출력을 >
연산자를 사용하여 파일로 요약 파일로 리디렉션 합니다.
awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt > output.txt
"$(cat list_of_files.txt)"