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


15

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

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

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

답변:


20

간단한 명령 대체를 사용하여 파일 이름을 가져 오지 마십시오 (공백 및 기타 특수 문자로 쉽게 구분할 수 있음). 다음과 같은 것을 사용하십시오 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)

주변 괄호 ()는 이것을 서브 쉘에서 실행하여 현재 쉘이 이러한 변경의 영향을받지 않도록합니다.


14

빠르고 더러운 방법 ...

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이미 파일이 있으면 덮어 쓰지 않고 파일에 추가 합니다)


1
@Zanna는 다음과 같은 단어 분리를 피하기 위해 명령 대체를 인용합니다."$(cat list_of_files.txt)"
Sergiy Kolodyazhnyy

4
@Serg 단어 분리가 수행되지 않으면 cat전체 목록을 하나의 인수로 가져옵니다.
muru

@muru OK, 공백이 포함 된 파일 이름을 어떻게 처리합니까?
Sergiy Kolodyazhnyy

1
@Serg는 이에 따라 IFS를 설정했습니다. – 내 답변의 마지막 단락 참조
muru

4

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.