2017-02-04 6 views
2

Я пытаюсь использовать bash, чтобы переименовать все файлы .txt в каталог, соответствующий определенному шаблону. Мои две попытки ниже удалили файлы из каталога и выбросили ошибку. Спасибо :)переименовать все файлы определенного типа в каталоге

вход

16-0000_File-A_variant_strandbias_readcount.vcf.hg19_multianno_dbremoved_removed_final_index_inheritence_import.txt 
16-0002_File-B_variant_strandbias_readcount.vcf.hg19_multianno_dbremoved_removed_final_index_inheritence_import.txt 

желаемого выходного

16-0000_File-A_multianno.txt 
16-0002_File-B_multianno.txt 

Bash попытка 1 this removes the files from the directory

for f in /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt ; do 
# Grab file prefix. 
p=${f%%_*_} 
bname=`basename $f` 
pref=${bname%%.txt} 
mv "$f" ${p}_multianno.txt 
done 

Bash попытка 2 Substitution replacement not terminated at (eval 1) line 1.

for f in /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt ; do 
# Grab file prefix. 
p=${f%%_*_} 
bname=`basename $f` 
pref=${bname%%.txt} 
rename -n 's/^$f/' *${p}_multianno.txt 
done 

ответ

3

Вам не нужен цикл. rename только может это сделать:

rename -n 's/(.*?_[^_]+).*/${1}_multianno.txt/g' /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt 

Смысла регулярного выражения примерно, не захватить все, от начала до 2 _, матча остального, и заменить захваченном префикс и добавить _multianno.txt

С флагом -n эта команда напечатает то, что бы она сделала, не выполняя ее. Когда выход выглядит хорошо, удалите -n и повторите попытку.

+1

Большое спасибо за большую помощь и объяснение, я ценю их :) – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^