파일 이름의 한 부분 만 변경하고 다른 파일의 목록에서 정확히 일치하는 항목을 기반으로하여 여러 파일의 이름을 바꾸고 싶습니다. 예를 들어 다음과 같은 파일 이름이있는 경우 :
sample_ACGTA.txt
sample_ACGTA.fq.abc
sample_ACGT.txt
sample_TTTTTC.tsv
sample_ACCCGGG.fq
sample_ACCCGGG.txt
otherfile.txt
그리고 replacements.txt라는 다른 파일에서 찾을 수있는 이러한 정확한 일치를 기반으로하여 찾고 바꾸고 싶습니다.
ACGT name1
TTTTTC longername12
ACCCGGG nam7
ACGTA another4
따라서 원하는 결과 파일 이름은
sample_another4.txt
sample_another4.fq.abc
sample_name1.txt
sample_longername12.tsv
sample_nam7.fq
sample_nam7.txt
otherfile.txt
내용을 변경하고 싶지 않습니다. 지금까지 나는 시도 sed
하고 mv
본 웹 사이트 내 검색 결과를 기반으로. 와 sed
내가 발견 내 목록을 사용하여 파일의 내용을 대체하는 방법 :
while read from to; do
sed -i "s/$from/$to/" infile ;
done < replacements.txt,
로와 mv
내가 파일의 이름을 변경하는 방법을 발견 한 하나 개의 단순한 교체가있는 경우 :
for files in sample_*; do
mv "$files" "${files/ACGTA/another4}"
done
그러나 내가 원하는 것을하기 위해 어떻게 그들을 모을 수 있습니까?
도와 주셔서 감사합니다!
for
와 while
루프를 완벽하게 결합하여 다음 을 사용할 수 있습니다 mv
.
while read from to ; do
for i in test* ; do
if [ "$i" != "${i/$from/$to}" ] ; then
mv $i ${i/$from/$to}
fi
done
done < replacements.txt
대체 솔루션은 대체 결과를 실행 sed
하는 e
명령을 사용하는 것으로 구성 될 수 있습니다 (주의하여 사용하십시오! e
어떤 명령이 실행될 것인지 인쇄 하려면 먼저 종료하지 않고 시도하십시오 ).
그 후:
sed 's/\(\w\+\)\s\+\(\w\+\)/mv sample_\1\.txt sample_\2\.txt/e' replacements.txt
replacements.txt 파일을 구문 분석하고 원하는대로 모든 .txt 파일의 이름을 바꿉니다.
다른 확장을 처리하기 위해 루프를 추가하기 만하면됩니다.
for j in .txt .bak .tsv .fq .fq.abc ; do
sed "s/\(\w\+\)\s\+\(\w\+\)/mv 'sample_\1$j' 'sample_\2$j'/e" replacements.txt
done
(예를 들어 실행을 시도 mv sample_ACGT.fq sample_name1.fq
하지만 파일 sample_ACGT.fq
이 존재하지 않는 경우와 같이 존재하지 않는 파일의 이름을 바꾸려고하면 오류 메시지가 표시됩니다. )
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다