Замініть всі кольори з імен файлів терміналом


12

На моєму жорсткому диску у мене є ГБ музики, яка була відформатована EXT4. Я хочу перенести ці файли на формат FAT, відформатований на жорсткому диску. Однак я не можу переміщувати більшість своїх файлів, тому що в іменах вони є ":" (Наприклад, "Act 2: ....." для опер). Чи є в командному рядку спосіб перейменувати всі мої файли з "XXXX: XXXX" на "XXXX-XXXX"?

Відповіді:


25

Якщо всі ваші файли в одному каталозі, спробуйте:

rename 's|:|-|g' *

(де * можна змінити на щось більш обмежувальне, якщо ви хочете)

Якщо у вашому каталозі є багато файлів, спробуйте це з основи дерева:

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

Ви можете додати цю опцію -nодразу після того, renameяк вона дозволить вам сказати, що БУДЕ БЕЗ РОБОТИ, без РЕАЛЬНО це робити. Це може допомогти вам не випадково наступити на інші файли чи щось інше погано ...


1
Рішення єдиного каталогу буде працювати, але вкладене рішення не буде, якщо у самих каталогах: s у своїх назвах. Це відбувається тому, що у виводі find .імені підкаталогу передує його вміст. Тож якщо у вас є файл, /1:/2:спочатку /1:/буде перейменований у /1-/. Тепер ви не можете перейменувати /1:/2:в /1-/2-тому , що /1:/2:не існує.
S Прасант

1
Для каталогів: find . -type d -readable -writable -exec rename 's|:|-|g' {} \;А потім файли:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;

@Christopher Команда для каталогів вийде з ладу, якщо є два рівні каталогів з: їхніми назвами. Наприклад: / 1: / 2: /, де 2: також є каталогом. Звичайно, якщо це не так у ситуації Райана, то це спрацює.
S Прасант

Для кількох рівнів суб-директорій використовувати: for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done. Змініть 20 на максимальну глибину режу. будова. Не обов’язково бути точним - може бути більшим. Хоча час знадобиться, якщо встановлено дуже велику кількість
S Прасант

0

Я зараз не на своїй машині Linux, тому я можу дати лише грубу інформацію.

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

Щоб бути безпечним, зробіть це невеликими партіями та / або першим тестом з імітацією (у перейменуванні є прапор, який просто дає вам стару назву та нове ім’я файлу, фактично не перейменовуючи - використовуйте це для перевірки спочатку)


0

Це рішення в 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до самого зовнішнього каталогу, що розглядається (Використовуйте повну назву шляху, починаючи з /. Немає скорочень або змінних env, таких як ~ дозволено). Не потрібно ставити \ перед спеціальними символами - наприклад, якщо самий зовнішній dir - /.../My HDD, поставте rootdir = "/.../My HDD"NOT rootdir = "/.../My\ HDD"(Зауважте "s" [Я це явно лише тому, що ви, можливо, незнайомі з python. Немає неповаги призначений.]
  3. Змініть logfileна потрібне місце реєстраційного файлу. Зрештою, цей файл буде містити список файлів, перейменованих - для подальшої довідки.
  4. Дзвінок python rename.py.

Попередження: зробіть тест на невеликому зразку, перш ніж ризикувати цілим ГБ музики.

Деталі: Перейменування виконується із внутрішніх файлів назовні.


0

Я усвідомлюю, що це дуже старий пост. Рекурсивне рішення 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.