2014-09-07 6 views
5

Это должен быть основной вопрос для многих людей, но я биолог, не имеющий программирования, поэтому, пожалуйста, извините мой вопрос.пакетное переименование файлов с выражениями perl

То, что я пытаюсь сделать, это переименовать около 100 000 gzipped файлов данных, которые имеют существующее имя кода (пример: XG453834.fasta.gz). Я бы хотел назвать их легко читаемыми и анализируемыми мной (пример: Xanthomonas_galactus_str_453.fasta.gz).

Я попытался использовать sed, rename и mmv, но напрасно. Если я использую любую из этих команд в однократном скрипте, они работают нормально, просто я пытаюсь включить переменные в сценарий оболочки, столкнувшись с проблемами. Я не получаю никаких ошибок, просто имена не изменены, поэтому я подозреваю, что это ошибка ввода-вывода.

Вот что мои файлы выглядеть следующим образом:

#! /bin/bash 
# change a bunch of file names 
file=names.txt 

while IFS=' ' read -r r1 r2; 
do 
    mmv ''$r1'.fasta.gz' ''$r2'.fasta.gz' 
    # or I tried many versions of: sed -i 's/"$r1"/"$r2"/' *.gz 
    # and I tried many versions of: rename -i 's/$r1/$r2/' *.gz 

done < "$file" 

... и вот первые строки моего текстовый файл с одним пробелом разделителем:

cat names.txt 

    #find #replace 
    code1 name1 
    code2 name2 
    code3 name3 

Я знаю, что могу сделать это с питоном или perl, но поскольку я застрял здесь, работая над этим конкретным скриптом, я хочу найти простое решение для исправления этого сценария bash и выяснить, что я делаю неправильно. Большое спасибо за любую помощь.

Кроме того, я попробовал cat файл имен (см. Комментарий от Ashoka Lella ниже), а затем используйте awk для перемещения/переименования. Некоторые из файлов имеют имена переменных (но всегда начинаются с кода), поэтому я ищу найти вариант замены &, чтобы просто заменить «код» на «имя» и сохранить структуру имени файла.

Я подозреваю, что я не избегаю переменной в пределах одного тика выражения perl, но я наполнил множество руководств, и я не могу найти способ сделать это.

+0

Все ответы будут рассмотрены на примерах, которые вы предоставили. Если ваши имена на самом деле более сложны (т. Е. Содержат пробелы/специальные символы, тогда вы должны отредактировать свой вопрос, чтобы показать некоторые примеры, которые лучше отражают ситуацию. Если вам требуется более сложная логика (условное переименование, сопоставление образцов и т. Д.), Тогда вы должны сделать это ясно, показывая некоторые примеры желаемого поведения в вопросе. –

+0

Спасибо за вашу помощь Том, я действительно ценю это. Похоже, что большинство моих проблем связаны с несоответствующими «кодами», которые, по-видимому, в нескольких тысячах файлов данных это менее прямой ответ. Вероятно, я попытаюсь обратиться к этому сценарию с помощью скрипта python, но я надеялся на что-то более простое. Еще раз спасибо за то, что помогли мне узнать лучший способ сделать это! –

ответ

1

Это должно переименовать все файлы в столбце1 в столбец2 names.txt. При условии, что они находятся в той же папке, names.txt

cat names.txt| awk '{print "mv "$1" "$2}'|sh 
+0

Спасибо за ваш вклад! Я пробовал это уже (должно быть, яснее выше, я буду редактировать), и это работает примерно с половиной имен файлов данных, но некоторые из них передаются мне с именем переменной s, но которые начинаются с обозначения кода, поэтому я ищу дополнительную функцию поиска и замены (по сравнению с переименованием). Похоже, я должен пыль от книги питона - это было бы хорошей практикой для меня. Еще раз спасибо! –

3

Если вы абсолютно уверены, чем имена файлов не содержит пробелов вкладок, вы можете попробовать следующий

xargs -n2 < names.txt echo mv 

Это для сухого хода (только печать, что будет делать) - если вы удовлетворены результатом, удалите echo ...

Если вы хотите проверить существование Ot цели, использовать

xargs -n2 < names.txt echo mv -i 

, если вы не хотите, не позволяйте перезаписью целевого использования

xargs -n2 < names.txt echo mv -n 

снова, удалите echo если Youre удовлетворены.

3

Я не думаю, что вам нужно использовать mmv, простой mv будет делать.Кроме того, нет необходимости указывать IFS, по умолчанию будет работать для вас:

while read -r src dest; do mv "$src" "$dest"; done < names.txt 

Я в двойных кавычках имена переменных, как это обычно считается хорошей практикой, но в данном случае пространство ни в одном из имен файлов приведет к тому, что read не работает так, как вы ожидаете.

Вы можете поместить echo перед mv внутри цикла, чтобы убедиться, что будет выполнена правильная команда.

Обратите внимание, что в вашем файле names.txt уже включен суффикс .fasta.gz, поэтому вы не должны добавлять его внутри цикла. Возможно, это была твоя проблема?

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