답변:
ls *.txt | xargs cat >> all.txt
각 파일 후에 다시 작성하는 대신 all.txt에 추가하기 때문에 조금 더 잘 작동 할 수 있습니다.
그건 그렇고, cat *.txt >all.txt
또한 작동합니다. :-)
파일 이름 중 일부에 ','가 포함되어 있거나 구분 기호 문제로xargs
인해 공백 이 실패하는 경우
일반적으로 xargs
-0없이 실행 하면 다시 돌아와 언젠가 당신을 물게됩니다.
대신 GNU Parallel을 사용하십시오 :
ls *.txt | parallel cat > tmp/all.txt
또는 원하는 경우 :
ls *.txt | parallel cat >> tmp/all.txt
GNU Parallel에 대한 자세한 정보 http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
같은 디렉토리에있는 파일이므로 cat은 같은 파일에서 같은 파일로 쓰려고 할 때 혼란스러워집니다.
반면에 :
ls *.txt | xargs cat > tmp/all.txt
현재 디렉토리의 텍스트 파일에서 하위 디렉토리의 all.txt로 읽습니다 (에 포함되지 않음 *.txt
).
명령 행 길이 제한을 경험할 수도 있습니다. 사용하는 이유 중 하나 xargs
는 입력을 안전한 명령 줄 크기의 청크로 나눕니다. 따라서 디렉토리에 수십만 개의 .txt 파일이있는 상황을 상상해보십시오. ls *.txt
실패합니다. 해야 할 것
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
이 경우이 .txt로 끝나는 정규 표현식 일치하는 모든 것 (그래서 같은 정확히 아니에요 *.txt
당신이라는 파일이있는 경우 때문에, atxt
다음, *.txt
그것을 일치하지만, 정규 표현식하고자하지 않을 것입니다.)
다른 답변이 지적했듯이 all.txt는 패턴과 일치 *.txt
하므로 입력과 출력 사이에 충돌이 발생 하기 때문에 다른 경로를 사용 합니다.
파일 '
이름에 파일이 있으면 (이것이 unmatched single quote
오류 의 원인 일 수 있습니다. )
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
--null 옵션은 grep에게 \0
기본 줄 바꿈 대신 (일명 null) 문자로 구분 된 출력을 사용하도록 -0
지시하고`xargs 옵션은 입력이 동일한 형식으로 입력되도록 지시합니다. 줄 바꿈 파일 이름이있는 경우에도 작동합니다.
ls
이를 위해 . 당신은 정말 사용할 수없는 경우cat *.txt >all.txt
다음 시도 할printf '%s\0' *.txt | xargs -r0 cat >all
다음과mv all all.txt
자신을 참조하는 파일을 피하기 위해.