왜 이것이 작동하지 않습니까? “ls * .txt | xargs cat> all.txt”(모든 파일을 단일 txt 문서로)


20

왜 이것이 작동하지 않습니까?

ls *.txt | xargs cat > all.txt

(모든 텍스트 파일의 내용을 단일 'all.txt'파일로 결합하고 싶습니다.) -exec로 찾기도 작동하지만 xargs 구문을 이해하고 싶습니다.

감사


1
비록 사용하지 않는 ls이를 위해 . 당신은 정말 사용할 수없는 경우 cat *.txt >all.txt다음 시도 할 printf '%s\0' *.txt | xargs -r0 cat >all다음과 mv all all.txt자신을 참조하는 파일을 피하기 위해.
트리플 리

답변:


27

ls *.txt | xargs cat >> all.txt

각 파일 후에 다시 작성하는 대신 all.txt에 추가하기 때문에 조금 더 잘 작동 할 수 있습니다.

그건 그렇고, cat *.txt >all.txt또한 작동합니다. :-)


6
cat * .txt> all.txt는 당연히 좋습니다. 감사합니다
ajo

1
그러나 ... | xargs cat >> all.txt 또는> all.txt는 항상 xargs와 함께 오류를 반환합니다. 일치하지 않는 작은 따옴표 ... xargs는 명령 이후에 모든 것을 가져 오기 때문입니까?
ajo

1
공백이있는 파일 이름이 있습니까? 그렇다면 "find / your / path -iname '* .txt'-print0 | xargs -0 cat >> all.txt"와 같은 것을 사용하십시오
Janne Pikkarainen

1
아니요, 모든 파일 이름 공간을로 바꿨습니다 . 그러나 생각하면 일부 파일 이름에는 listing_O'Connor .txt와 같이 작은 따옴표가 포함될 가능성 이 있습니다. 문제가 될 수 있습니다!
ajo

그래, 그게 문제 야 :) 가장 쉽고 가장 안전한 방법은 xargs -0과 결합 된 -print0을 사용하여 find를 사용하는 것입니다. 그러면 전체 체인은 NULL 문자를 구분 기호로 사용하고 특수 문자는 자동으로 처리됩니다.
Janne Pikkarainen

3

파일 이름 중 일부에 ','가 포함되어 있거나 구분 기호 문제로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


1

all.txt 같은 디렉토리에있는 파일이므로 cat은 같은 파일에서 같은 파일로 쓰려고 할 때 혼란스러워집니다.

반면에 :

ls *.txt | xargs cat > tmp/all.txt

현재 디렉토리의 텍스트 파일에서 하위 디렉토리의 all.txt로 읽습니다 (에 포함되지 않음 *.txt).


여전히 다음 오류가 발생했습니다. xargs : 일치하지 않는 작은 따옴표; -0 옵션을 사용하지 않는 한 기본적으로 따옴표는 xargs에 특별합니다.
ajo

1
이름에 작은 따옴표가있는 .txt 파일이 있습니까?
Jeremy Smyth

0

명령 행 길이 제한을 경험할 수도 있습니다. 사용하는 이유 중 하나 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 옵션은 입력이 동일한 형식으로 입력되도록 지시합니다. 줄 바꿈 파일 이름이있는 경우에도 작동합니다.

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