2014-10-22 2 views
0

그래서 Genomes라는 폴더가 있습니다.이 폴더에는 3000 개의 폴더가 모두 있고 그 안에 하나의 파일이 있습니다. 이 모든 파일을 하나의 큰 파일로 결합하려고합니다. bash에서이 작업을 수행 할 수있는 방법이 있어야한다고 생각합니다.하지만 어떻게해야하는지 확신 할 수 없습니다.디렉토리의 모든 폴더에있는 모든 파일을 결합하십시오.

+2

당신은 모든 파일을 연결하려는 의미 : 여기 – lurker

+3

'cat */*> output'? –

답변

2
(
cd Genomes 
cat */* > ../Genomes-combined-data 
) 

이 모든 파일의 연결을 포함하는 Genomes 디렉토리와 동일한 수준에서 하나의 파일을 만듭니다.

유일한 문제는 인수 목록의 길이 일 수 있습니다.

find Genomes -type f -exec cat {} + > Genomes-combined-data 

이 이름을 결정하기 위해 find을 사용하고 관리 조각으로 목록을 분할 : 그게 문제라면, 다음 (— 단지 Genomes 디렉토리에 —을 디렉토리에 파일이 없으면 가정). 최종 결과는 이전에 3000 개의 개별 파일에 있었던 모든 데이터를 포함하는 단일 파일을 갖게된다는 점에서 본질적으로 동일합니다. 그러나 Michał Górnycomment을 가리 킵니다. 따라서 파일의 데이터 순서는 */*을 사용하는 경우와 다를 수 있습니다. 필요한 경우 find ... -print0sort -z으로 파이프하여 xargs -0 cat에 파이프하여 이름의 공백이나 줄 바꿈을 처리 할 수 ​​있습니다. 이들 모두는 POSIX 도구에 대한 표준 확장이 아닙니다.

find Genomes -type f -print | sort | xargs cat > Genomes-combined-data 

을 당신이 원하는대로 당신은 복잡한대로 정렬 기준을 만들 수 있습니다

find Genomes -type f -print0 | sort -z | xargs -0 cat > Genomes-combined-data 

당신이 제정신 이름을 알고 있다면, 당신은 간단하게 사용할 수 있습니다.

물론 편리한 위치에 출력 파일을 배치 할 수 있습니다. 극단적으로 운이 좋다면 출력 파일을 find으로 지정하여 —으로 설정하면 전체 디스크가 될 수 있습니다.

(find Genomes -type f | sort | xargs tail -n +1) > Genomes-all 
+2

그물 결과 *는 동일하지 않습니다. '*/*'는 파일을 어순으로 정렬하고,'find'는하지 않습니다. :) –

+0

@ MichałGórny : 좋습니다, 공정한 의견입니다. –

+1

덮어 쓰는 대신에 추가하려면'>>'을 사용하십시오. –

0

모든 파일 이름을 분류하고, 각 나타내는 자신의 이름에 대한 헤더로 하나 개의 파일 ( Genomes-all)에 그 내용을 연결하는 한 줄의 ? 특정 순서로 연결된 것을 요구합니까? 당신의 폴더는`Genomes` 아래의 한 레벨보다 더 깊게 갈 수 있습니까? 세부 정보를 입력하십시오.
관련 문제