У меня на жестком диске музыка в ГБ, отформатированная в EXT4. Я хочу переместить эти файлы в раздел жесткого диска в формате FAT. Тем не менее, я не могу переместить большинство моих файлов, потому что они имеют «:» в именах (например, «Act 2: .....» для опер). Есть ли способ с помощью командной строки переименовать все мои файлы из «XXXX: XXXX» в «XXXX-XXXX»?
Я сейчас не на своей машине с Linux, поэтому могу дать только приблизительную информацию.
В Linux есть утилита командной строки под названием rename
, которая работает с другими входными данными, регулярными выражениями или регулярными выражениями. Вы должны иметь возможность использовать это вместе с регулярным выражением типа "s /: / - /" в ваших файлах для достижения желаемого переименования.
Просто чтобы быть в безопасности, делайте это небольшими партиями и / или первым тестом с симуляцией (переименование имеет флаг, который просто дает вам старое имя и новое имя файла без фактического переименования - используйте это, чтобы сначала проверить )
Это - решение в Python, который обрабатывает случай, где файлы находятся не обязательно в том же каталоге.
import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
for dirname in dirs:
if ':' in dirname:
torename.append(os.path.join(path, dirname))
for filename in files:
if ':' in filename:
torename.append(os.path.join(path, filename))
print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
torename.reverse()
for oldname in torename:
directory, filename = os.path.split(oldname)
newname = os.path.join(directory, filename.replace(':', '-'))
command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
os.system(command)
f = open(logfile, 'a')
f.write(oldname + '\n')
f.close()
else:
print "Aborted."
rootdir
к наиболее удаленному каталогу на рассмотрении (Используют имя полного пути, запускающееся с/. Никакой shorthands или огибающие переменные как позволенный ~). Никакая потребность поместить \перед специальными символами - например, если наиболее удаленный dir/.../Мой жестких дисков, помещенных rootdir = "/.../My HDD"
НЕТ rootdir = "/.../My\ HDD"
(Отметьте, "s) [я - это явное только потому, что можно быть незнакомыми с Python. Никакая непочтительность не предназначается.]logfile
к желаемому местоположению файла журнала. В конце этот файл будет содержать список переименованных файлов - для дальнейшего использования.python rename.py
.Предупреждение: Действительно протестируйте на небольшой выборке прежде, чем рискнуть всем ГБ музыки.
Подробнее: Переименование выполняется из самых внутренних исходящих файлов.
Если все ваши файлы находятся в одном каталоге, попробуйте:
rename 's|:|-|g' *
(где * можно изменить на что-то более ограничительное, если хотите)
Если у вас много файлы в дереве каталогов, попробуйте это из основания дерева:
find . -name "*:*" -exec rename 's|:|-|g' {} \;
Вы можете добавить опцию -n
сразу после rename
, чтобы она говорила вам, что она БУДЕТ делать без ФАКТИЧЕСКОГО ее выполнения. , Это может помочь вам избежать случайного наступления на другие файлы или что-то еще плохое ...
Я понимаю, что это - очень старое сообщение. Рекурсивное решение AeroGT80 очень полно, но это довольно медленно. У меня был он работающий приблизительно в течение получаса на более медленном сервере, и это только стало приблизительно наполовину сделанным - я думаю, что это были приблизительно 73 000 файлов приблизительно в 300 подкаталогах.
решение ниже будет работать намного более быстрый (оно воздействует на все файлы в каталоге вместо каждого файла один за другим - использование нерекурсивного решения AeroGT80). Единственная проблема, она только спускается по одному каталогу глубоко (таким образом, это не полностью рекурсивно как его решение), но я уверен, что она могла быть изменена достаточно легко.
#!/bin/bash
for D in *; do
if [ -d "${D}" ]; then
#echo "${D}"
pushd "${D}" > /dev/null
rename 's|:|-|g' *
popd > /dev/null
fi
done