Переименование нескольких файлов, но только части названия

Переименование нескольких файлов, но только части названия

Мне нужно переименовать кучу файлов (около 167k), и только часть названия в каждом файле. От кого: Aaaa.bb - 2 tag tag_tag 9tag Aaaa.bb - 125 tag_tag 9tag Aaaa.bb - 3567 tag 9tag Кому: Aaaa.bb - 000002 tag tag_tag 9tag Aaaa.bb - 000125 tag_tag 9tag Aaaa.bb - 003567 tag 9tag Все на внешнем HDD Есть ли какой-нибудь инструмент или скрипт, который может мне помочь в этой ситуации? Также забыл упомянуть, что я еще новичок в Ubuntu и всех этих сложных вещах, поэтому я попрошу упростить ответы

решение1

Вот мое мнение по этому поводу, с использованием bash, awk, и mv.

Если мы посмотрим на имя файла с точки зрения awk, имя файла — это просто строка с полями, разделенными пробелами, и особый интерес представляет поле $3, которое должно быть дополнено нулями. Скрипт ниже делает именно это. Убедитесь, что вы поместили скрипт и запустили его в том же каталоге, что и файлы, которые вы хотите переименовать. Также убедитесь, что он исполняемый с помощьюchmod 755 renamerScript.sh

Демо

testdir:$ ls
Aaaa.bb - 125 tag tag_tag 9tag  Aaaa.bb - 2 tag tag_tag 9tag  Aaaa.bb - 4207 tag tag_tag 9tag  BACKUP/  renamerScript.sh*

testdir:$ ./renamerScript.sh                                                                                                                          
mkdir: cannot create directory ‘BACKUP’: File exists
cp: omitting directory ‘BACKUP’
renaming Aaaa.bb - 125 tag tag_tag 9tag to Aaaa.bb - 000125 tag tag_tag 9tag 
renaming Aaaa.bb - 2 tag tag_tag 9tag to Aaaa.bb - 000002 tag tag_tag 9tag 
renaming Aaaa.bb - 4207 tag tag_tag 9tag to Aaaa.bb - 004207 tag tag_tag 9tag 

testdir:$ ls
Aaaa.bb - 000002 tag tag_tag 9tag  Aaaa.bb - 000125 tag tag_tag 9tag  Aaaa.bb - 004207 tag tag_tag 9tag  BACKUP/  renamerScript.sh*

Сценарий

#!/bin/bash
# renamerScript.sh
# Author: Serg Kolo
# Date: Oct 17, 2015
# Purpose : renaming specific files
# Written for: http://askubuntu.com/q/686794/295286

# Make sure you have backup of the files !!!
# comment/uncomment if you do want to do a backup

mkdir BACKUP
cp -t BACKUP *

# This is where the magic happens:
# If we look at filenames from the awk point of view
# "Aaaa.bb - 2 tag tag_tag 9tag" are all really 
# space-separated fields. Field #3 is the one we need to edit.
# What we can do is pad it with zeros and then chop off 6 
# characters from the end, and store that as new filename
# The rest is just doing mv command from old filename to new
# And also making sure we're operating on files , not directories
# and not renaming the script file,too

for FILENAME in * ; 
do  
 if [ -f "$FILENAME" -a "$FILENAME" != "renamerScript.sh" ]; then

   OLDFILENAME="$FILENAME"
   NEWFILENAME=$(echo "$FILENAME" | awk '{$3="00000"$3; len=(length($3)-5); $3=(substr($3,len)); print  }')
   printf "renaming $OLDFILENAME to $NEWFILENAME \n"
   mv "$OLDFILENAME" "$NEWFILENAME"
 fi
done 

решение2

Я бы рекомендовал Python и использование регулярных выражений. Вот пример скрипта, который я сделал, который может cnahge все файлы в папке и подпапках.

directoryChosen = (sys.argv[1])

print directoryChosen + "   thi is inside dollartohash"
if os.path.isdir(directoryChosen):
    for n in os.listdir(directoryChosen):
        if not n.startswith('.'):

            newname =  n.replace('$', '#')
            print newname
            if newname != n:
                path = os.path.join(directoryChosen, n)
                print path + "    this is path"
                target = os.path.join(directoryChosen, newname)
                print target + "   this is target"
                os.rename(path, target)

    newdir = directoryChosen.replace('$', '#')
    print newdir
    if directoryChosen != newdir :
         os.rename(directoryChosen, newdir)

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

решение3

Вы можете использовать команду на основе Perl renameдля повторной печати последовательности цифр после пробела-дефиса-пробела в желаемом формате и с желаемой шириной поля, например:

rename -vn -- 's/ - (\d+)/sprintf " - %06d", $1/e' *

(флаг -n означает «no op», т.е. он просто выполнит пробный прогон для проверки выражения: удалите его, если/когда вы будете уверены, что оно работает правильно).

решение4

ПытатьсяpyRenamerсредство массового переименования файлов, которое переименовывает файлы с использованием шаблонов, замен, вставки или удаления текста или даже переименовывает файлы вручную.

Он имеет графический интерфейс со следующими функциями:

  • Шаблоны для переименования файлов. Поиск и замена для переименования файлов. Вставка и удаление символа в любом месте имени файла. Использование заглавных букв (сделать имя файла заглавным). Распространенные замены. Ручное переименование выбранных файлов. Переименование изображений с использованием их метаданных. Переименование музыки с использованием ее метаданных.Источник

Установить:sudo apt-get install pyrenamer

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