Мне нужно переименовать группу файлов (около 167 КБ), и только часть заголовка в каждом файле. From: Aaaa.bb - 2 tag tag_tag 9tag
Aaaa.bb - 125 tag_tag 9tag
Aaaa.bb - 3567 tag 9tag
To: Aaaa.bb - 000002 tag tag_tag 9tag
Aaaa.bb - 000125 tag_tag 9tag
Aaaa.bb - 003567 tag 9tag
Все находится на внешнем жестком диске. Есть ли какой-либо инструмент или сценарий, который может помочь мне в этой ситуации? Также забыл упомянуть, что я все еще новичок в Ubuntu и всяких хитрых вещах, поэтому я попрошу упростить ответы
Вот мое взятие в нем, используя 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
Попробуйте pyRenamer оптовый файл renamer, которые переименовывают файлы, используя образцы, замены, вставляют или удаляют текст или даже переименовывают файлы вручную.
у Этого есть окно графический интерфейса пользователя с этими особенностями:
Установите: sudo apt-get install pyrenamer
gedbi-core
doesn' t существуют. It' s gdebi-core
.
– TheWanderer
6 January 2017 в 14:27
Я был бы reccomend Python и использующий regex. Вот пример сценария, который я сделал, который может 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)
Поскольку Вы видите, что это берет каталог в качестве аргумента и изменяет символ на другой символ. Я уверен, что можно изменить часть замены.
//
из запуска. Это кажется там isn' t другое решение для него.
– ICE
6 January 2017 в 12:03
Вы могли использовать находящееся в perl rename
команда, чтобы переиздать последовательность цифр после космического пространства дефиса в желаемом формате и полевой ширине, например,
rename -vn -- 's/ - (\d+)/sprintf " - %06d", $1/e' *
(-n средства флага 'никакой op', т.е. это просто сделает пробный прогон, чтобы проверить выражение: удалите его, если/когда Вы уверены, что это работает правильно).