2011-12-16 2 views
3

이름에 "_BASE_"이 (가) 포함되지 않은 파일을 연결하고 싶습니다. 나는 그것이 줄의 어딘가에있을 것이라고 생각했다. ...unix : grep에서 일치하는 파일을 연결하는 방법

ls | grep -v _BASE_ | cat > all.txt 

고양이 부분은 내가 옳지 않은 부분이다. 아무도 나에게 이것에 대해 어떤 생각을 줄 수 있습니까?

답변

4

ls | grep -v _BASE_ | xargs cat > all.txt 
2

당신은 ls--ignore 옵션을 사용하여 일부 파일을 무시하고 파일에 다음 고양이를 할 수보십시오.

ls --ignore="*_BASE_*" | xargs cat > all.txt 

또한 당신은 xargs없이 그렇게 할 수 있습니다

cat $(ls --ignore="*_BASE_*") > all.txt 

UPD : 데일 Hagglund 눈치처럼 그 이름은 "일부 파일은"이 파일 이름, "일부"와 "파일로 나타납니다 ". --quoting-style=WORD 옵션을 사용할 수 없게하려면 WORDshell 또는 escape이 될 수 있습니다.

예를 들어 --quoting-style=shell 인 경우 일부 파일은 '일부 파일'로 인쇄되며 하나의 파일로 해석됩니다.

또 다른 문제는 출력 파일이 ls ed 파일 중 하나와 같을 수 있다는 것입니다. 우리도 그것을 무시할 필요가 있습니다.

그래서 대답은 :

outputFile=a.txt; ls --ignore="*sh*" --ignore="${outputFile}" --quoting-style=shell | xargs cat > ${outputFile} 
+0

파일 이름에 공백이 포함되어 있지 않은 경우 이들 중 어느 것도 작동하지 않습니다. "Some File"과 같은 파일 이름은'cat'에 전달 될 때 "Some"과 "File"이라는 두 개의 파일 이름으로 나타납니다. –

+0

대답을 수정했습니다. –

1

당신은 또한 하위 디렉토리에서 파일을 얻고 싶은 경우에,` '찾아 당신의 친구입니다 :

find . -type f ! -name '*_BASE_*' ! -path ./all.txt -exec cat {} >> all.txt \+ 

그것은 현재 디렉토리와 하위 디렉토리에있는 파일을 검색, 파일 (-type f) 만 찾은 다음 와일드 카드 패턴 *_BASE_*과 일치하는 파일을 무시하고 all.txt을 무시하고 xargs과 동일한 방식으로 cat을 실행합니다.

+0

+1 현재 디렉토리로 제한하려면 -maxdepth 1을 추가하십시오.이 이름은 해당 이름의 파일 공간도 깨끗하게 처리해야합니다. – jackrabbit

+0

'* _BASE_ *'부분을 인용합니다 (그렇지 않으면 zsh에서 작동하지 않습니다). 또한 rm all.txt를 앞에두고 cat의 리디렉션을 >>로 지정하십시오. 끝의 +는 아마 a이어야합니다. – jackrabbit

+0

\ + 고양이의 수를 줄이기위한 신중한 선택입니다. – tuomasjjrasanen

관련 문제