".fasta"로 끝나는 특정 단어가 포함된 파일을 어떻게 선택하고 변경할 수 있나요?
예를 들어 "car"라는 단어가 포함된 파일을 선택합니다.
find /home/user -name "*car*"
이것은 나에게 준다
/home/user/car.txt
/home/user/scar.fa
/home/user/cart.fa
/home/user/scart.fasta
그런데 어떻게 바꾸는지 모르겠어서 모두 ".fasta"로 끝나네요.
그래서 최종 결과는
/home/user/car.fasta
/home/user/scar.fasta
/home/user/cart.fasta
/home/user/scart.fasta
답변1
옵션에서 as 명령을 사용하는 것이 좋습니다 rename
.-exec
find
find /home/user -name "*car*" -exec rename 's/[^.]*$/fasta/' {} \;
[^.]*$
파일 이름 끝에 점이 아닌 모든 항목을 일치시키고 fasta
확장자로 바꿉니다.
명령어를 모르신다면 확인해 보세요 man rename
.
답변2
Bash 솔루션에 대해서는 이 개요를 참조하세요.하위 문자열 삭제.
#!/bin/bash
for f in *car*; do
[[ ${f##*.} == "fasta" ]] && continue
f_no_ext="${f%%.*}"
if [[ -e "${f_no_ext}.fasta" ]]; then
echo "Not moving $f because it would clobber ${f_no_ext}.fasta"
continue
fi
mv "$f" "${f_no_ext}.fasta"
done
exit
그러면 모든 파일을 반복 *car*
하여 이름을 .fasta 확장자로 변경하고 이미 .fasta로 끝나는 파일은 건너뜁니다. 다른 솔루션에서는 이 단계를 무시할 수도 있다고 생각합니다.
if
편집: 파일 덮어쓰기를 방지하기 위해 확장자가 .fasta인 파일이 이미 존재하는지 확인하는 블록을 추가했습니다 . 예를 들어 car.txt와 car.fasta가 있는 경우입니다.
답변3
루프와 명령을 사용하는 mv
또 다른 방법 :
find /home/user -type f -name "*car*" | while read f; do mv -v "$f" "${f%.*}.fasta"; done