Переименование нескольких файлов с использованием цикла

Переименование нескольких файлов с использованием цикла

Мне нужно переименовать некоторые файлы с помощью цикла, но я не могу заставить это работать, так как я еще новичок в Linux. Файлы, которые нужно переименовать, следующие:

E9-GOWN33_multiplemap.bin.10.fa  
E9-GOWN33_multiplemap.bin.16.fa  
E9-GOWN33_multiplemap.bin.21.fa  
E9-GOWN33_multiplemap.bin.7.fa

на более короткое имя, например:

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

Я использовал renameи mvдругие циклы, которые видел в темах, но все равно не могу заставить их работать. Любой вклад будет очень ценен! Спасибо!

решение1

Если у вас есть Perl rename(по умолчанию в Ubuntu, Debian и многих других системах), вы можете просто сделать

rename -n 's/-GOWN33_multiplemap//' ./*fa

Если это даст вам правильные имена файлов, запустите без , -nчтобы фактически переименовать их:

rename 's/-GOWN33_multiplemap//' ./*fa

решение2

Вы можете попробовать это:

for f in *.fa; do 
  echo mv -- "$f" "${f%-*}.${f#*.}"
done

Результат:

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

решение3

Предположим, что все эти файлы находятся в текущем каталоге и что все они, и ни один другой файл, соответствуют шаблону подстановки

E9-GOWN33_multiplemap.bin.*.fa

Затем вы можете выполнить цикл по ним с помощью

for name in E9-GOWN33_multiplemap.bin.*.fa; do
   # more code here
done

Внутри цикла $nameбудет имя одного из этих файлов.

Учитывая имя E9-GOWN33_multiplemap.bin.10.faв $name, мы можем удалить E9-GOWN33_multiplemapбит из начала имени с помощью

${name#E9-GOWN33_multiplemap}

Затем остается только заново прикрепить начальную E9строку к передней части, чтобы создать E9.bin.10.fa:

newname=E9${name#E9-GOWN33_multiplemap}

Затем mvмы можем переименовать старое имя файла в новое:

mv "$name" "$newname"

Итак, с этим у нас есть

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    newname=E9${name#E9-GOWN33_multiplemap}
    mv "$name" "$newname"
done

или короче,

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    mv "$name" "E9${name#E9-GOWN33_multiplemap}"
done

решение4

for f in *.fa; do mv -- "$f" "${f/-*p./.}"; done
  • вход:
    E9-GOWN33_multiplemap.bin.7.fa
    E9-GOWN33_multiplemap.bin.10.fa
    E9-GOWN33_multiplemap.bin.16.fa
    E9-GOWN33_multiplemap.bin.21.fa
    
  • выход:
    E9.bin.7.fa
    E9.bin.10.fa
    E9.bin.16.fa
    E9.bin.21.fa
    

Вы также можете использовать этот скрипт:

#!/bin/bash

# Set the directory path where the files are located
directory="/path/to/files"

# Loop through the files in the directory
for file in "$directory"/E9-GOWN33_multiplemap.bin.*.fa; do
    # Extract the original filename
    filename=$(basename "$file")
    
    # Extract the numeric part from the original filename
    number=$(echo "$filename" | awk -F'.' '{ print $3 }')
    
    # Create the new filename
    new_filename="E9.bin.$number.fa"
    
    # Rename the file
    mv "$file" "$directory/$new_filename"
done

В этом скрипте цикл for перебирает файлы, соответствующие шаблону E9-GOWN33_multiplemap.bin.*.fa в указанном каталоге. Внутри цикла исходное имя файла извлекается с помощью basename. Затем числовая часть извлекается с помощью awk. Наконец, новое имя файла создается путем объединения фиксированных частей (E9.bin.) с извлеченным числом. Команда mv используется для переименования файла с новым именем файла.

Связанный контент