Заменить все двоеточия из имен файлов с терминалом

У меня на жестком диске музыка в ГБ, отформатированная в EXT4. Я хочу переместить эти файлы в раздел жесткого диска в формате FAT. Тем не менее, я не могу переместить большинство моих файлов, потому что они имеют «:» в именах (например, «Act 2: .....» для опер). Есть ли способ с помощью командной строки переименовать все мои файлы из «XXXX: XXXX» в «XXXX-XXXX»?

10
задан 10 December 2012 в 10:13

4 ответа

Я сейчас не на своей машине с Linux, поэтому могу дать только приблизительную информацию.

В Linux есть утилита командной строки под названием rename , которая работает с другими входными данными, регулярными выражениями или регулярными выражениями. Вы должны иметь возможность использовать это вместе с регулярным выражением типа "s /: / - /" в ваших файлах для достижения желаемого переименования.

Просто чтобы быть в безопасности, делайте это небольшими партиями и / или первым тестом с симуляцией (переименование имеет флаг, который просто дает вам старое имя и новое имя файла без фактического переименования - используйте это, чтобы сначала проверить )

0
ответ дан 10 December 2012 в 10:13

Это - решение в 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."
  1. Сохраните это в файл (говорит) rename.py.
  2. Изменение rootdir к наиболее удаленному каталогу на рассмотрении (Используют имя полного пути, запускающееся с/. Никакой shorthands или огибающие переменные как позволенный ~). Никакая потребность поместить \перед специальными символами - например, если наиболее удаленный dir/.../Мой жестких дисков, помещенных rootdir = "/.../My HDD" НЕТ rootdir = "/.../My\ HDD" (Отметьте, "s) [я - это явное только потому, что можно быть незнакомыми с Python. Никакая непочтительность не предназначается.]
  3. Изменение logfile к желаемому местоположению файла журнала. В конце этот файл будет содержать список переименованных файлов - для дальнейшего использования.
  4. Звонить python rename.py.

Предупреждение: Действительно протестируйте на небольшой выборке прежде, чем рискнуть всем ГБ музыки.

Подробнее: Переименование выполняется из самых внутренних исходящих файлов.

0
ответ дан 10 December 2012 в 10:13

Если все ваши файлы находятся в одном каталоге, попробуйте:

rename 's|:|-|g' *

(где * можно изменить на что-то более ограничительное, если хотите)

Если у вас много файлы в дереве каталогов, попробуйте это из основания дерева:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

Вы можете добавить опцию -n сразу после rename, чтобы она говорила вам, что она БУДЕТ делать без ФАКТИЧЕСКОГО ее выполнения. , Это может помочь вам избежать случайного наступления на другие файлы или что-то еще плохое ...

0
ответ дан 10 December 2012 в 10:13

Я понимаю, что это - очень старое сообщение. Рекурсивное решение 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
0
ответ дан 16 October 2019 в 14:04

Другие вопросы по тегам:

Похожие вопросы: