목록에있는 모든 파일의 내용을 다른 파일로 어떻게 복사합니까? 각 파일

파일 안에 파일 이름 목록이 list_of_files.txt있습니다.

해당 목록의 각 파일 내용을이라는 다른 파일로 복사하고 싶습니다 all_compounds.sdf.

명령 줄에서 어떻게해야합니까?



답변

간단한 명령 대체를 사용하여 파일 이름을 가져 오지 마십시오 (공백 및 기타 특수 문자로 쉽게 구분할 수 있음). 다음과 같은 것을 사용하십시오 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...)로 전달할 수 있습니다.command2cat
  • 그런 다음 리디렉션 >>을 사용 하여 stdout으로 인쇄하는 대신 출력을 파일로 보냅니다. 출력을 보려면 tee대신 사용하십시오 .

    cat $(cat list_of_files.txt) | tee -a all_compounds.sdf

( 파일이 이미있는 경우 스위치 >>대신 >및 스위치 와 tee함께 사용 했습니다. -a이미 파일이 있으면 덮어 쓰지 않고 파일에 추가 합니다)


답변

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


답변