여러 디렉터리에 동일한 이름을 가진 새로운 연결된 파일 생성

여러 디렉터리에 동일한 이름을 가진 새로운 연결된 파일 생성

이름이 다른 여러 하위 디렉터리에 같은 이름을 가진 파일이 많이 있습니다(비록 모두 같은 수준에 있음에도 불구하고). 동일한 파일을 모두 해당 이름의 새 파일로 연결하고 싶습니다. 이 새 파일이 상위 디렉터리에 있기를 원합니다.

SE에 게시된 답변 중 일부를 시도했습니다.같은 이름의 파일을 이동하고 연결하는 방법

내가 시도한 것과 문제는 다음과 같습니다.

find */*/*/seq/in/ -type f -name '*.fasta' -exec bash -c 'cat "{}" >> new_file' \;

그러면 이름이 일치하는 파일뿐만 아니라 접미사가 .fasta인 모든 파일이 new_file이라는 파일로 연결됩니다.

for file in */*/*/seq/in/*.fasta; 
do 
cat "$file" >> "$file.cat" done

이는 .cat이 추가된 동일한 원본 하위 디렉터리의 각 파일을 복사합니다.

내가 뭘 잘못했나요? 매우 감사합니다!

답변1

이 작업은 두 단계로 수행해야 합니다.

  1. 모든 고유한 Fasta 파일 이름을 찾으십시오.
  2. 각 이름에 대해 해당 이름을 가진 모든 파일을 찾아서 연결합니다.

첨부된 코드:

모든 Fasta 파일을 찾습니다(파일 이름이 정상이고 줄 바꿈이 포함되어 있지 않다고 가정).

find . -type f -path '*/seq/in/*.fasta' -exec basename {} ';' | sort -u -o file.list

그런 다음 각 이름에 대해 동일한 이름을 가진 모든 파일을 연결합니다. 생성된 파일은 new현재 디렉터리 내의 디렉터리 에 배치됩니다 . 새 파일은 연결된 파일과 동일한 이름을 갖게 됩니다.

mkdir new
while read -r name; do
    find . -type f -path "*/seq/in/$name" -exec cat {} + >"new/$name"
done <file.list

당신에 관한 그 것가능한find각 호출 에 추가하려는 내용은 -mindepth 6 -maxdepth 6(또는 적절한 깊이, 6은 1로 줄어들 수 있음) 파일 계층의 동일한 깊이에서 파일을 모두 가져오는 것입니다. 앞에 이러한 옵션을 삽입하십시오 -type f.


별도의 Fasta 파일 이름 목록 생성을 우회하는 주석에서 Steeldriver가 제안한 대안:

mkdir new
find . -type f -path '*/seq/in/*.fasta' \
    -exec sh -c 'for pathname do cat "$pathname" >>"new/${pathname##*/}"; done' find-sh {} +

관련 정보