이름이 다른 여러 하위 디렉터리에 같은 이름을 가진 파일이 많이 있습니다(비록 모두 같은 수준에 있음에도 불구하고). 동일한 파일을 모두 해당 이름의 새 파일로 연결하고 싶습니다. 이 새 파일이 상위 디렉터리에 있기를 원합니다.
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
이 작업은 두 단계로 수행해야 합니다.
- 모든 고유한 Fasta 파일 이름을 찾으십시오.
- 각 이름에 대해 해당 이름을 가진 모든 파일을 찾아서 연결합니다.
첨부된 코드:
모든 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 {} +