Рекурсивно добавить что-то к файлам, которые не заканчиваются на "]"

Я пытаюсь рекурсивно добавить [Full] ко всем файлам, которые не заканчиваются на ] во всех подкаталогах.

Пример:

Untold Story.wav должен быть переименован в Untold Story [Full].wav

Untold Story [Instrumental].wav должен не быть переименован в Untold Story [Instrumental] [Full].wav

Спасибо!

3
задан 1 June 2015 в 00:17

4 ответа

Сценарий ниже должен сделать задание. Использовать его:

  1. Скопируйте его в пустой файл
  2. Сохраните его как rename.py
  3. Выполните его:

    python3 /path/to/rename.py <directory_with_files>
    

Сценарий:

#!/usr/bin/env python3
import shutil
import os
import sys

for root, dirs, files in os.walk(sys.argv[1]):
    for file in files:
        check = file.rfind("."); name = file[:check]
        print(name)
        if all([not name.endswith("]"), check not in (-1, 0)]):
            shutil.move(root+"/"+file, root+"/"+name+" [Full]"+file[check:])

Что это делает:

  • Это разделяет файл на базовое имя + расширение (все файлы в каталоге рекурсивно)
  • Видит, заканчивается ли базовое имя"]"
  • В противном случае это добавляет "[Полный]" до базового имени, соединения, это с расширением и перемещениями (переименовывает) файл.
  • Невидимые файлы или файлы без расширения, оставлены в покое.
  • Это работает со всеми расширениями
3
ответ дан 1 June 2015 в 00:17

Это добавит [FULL] к названиям всего .wav, имена которого не заканчиваются в ].wav:

find . -type f ! -name '*].wav' -exec bash -c 'mv "$1" "${1%.wav} [FULL].wav"' none {} \;

Как это работает

  • find . -type f ! -name '*].wav'

    Это рекурсивно находит все регулярные файлы под текущим каталогом, ., чьи имена не заканчиваются в ].wav.

    -name '*].wav' искал бы файлы, имена которых заканчиваются в ].wav. С тех пор ! отрицание, ! -name '*].wav' ищет все файлы, имена которых не заканчиваются в ].wav

  • -exec bash -c 'mv "$1" "${1%.wav} [FULL].wav"' none {} \;

    Это переименовывает файлы это find найденный.

    Это передает название файла в удар как его первый аргумент, $1. mv используется для переименования файла.

3
ответ дан 1 June 2015 в 00:17

И моя версия с find, xargs и rename

find . -type f -iname "*.wav" -print0 | xargs -0 -I {} rename -v 's/^(.*[^\]])(\..*)/$1 [Full]$2/' {}
  • Запуск прост, find …, Вы можете легкое изменение запуск (.) папка и файлы соответствия (*.wav):

    Поиск в текущей папке (.) для всех файлов (-type f) с расширением .wav (-iname "*.wav")

  • Создайте a rename команда с xargs

    {} в rename … заменяется find результаты

Что-то Регулярные выражения и это работают.

3
ответ дан 1 June 2015 в 00:17

Это будет работать только на файлы с именем файла включая расширение:

Используя find+xargs+rename:

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename -n "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"
  • . в find: списки все файлы и папки в текущем рабочем каталоге, рекурсивно
  • -type f в find: списки только файлы
  • -regex "[...]": списки только файлы с именем файла, соответствующим [...] regex
  • ^.*[^]]\..*$: соответствия любая строка, не имеющая a ] символ, предшествующий последнему . символ
  • -print0 в find: имена файлов печати сопровождаются a NULL символ вместо символа новой строки
  • xargs: передачи путь каждого файла к rename
  • -n в rename: печатает изменения, не применяя их
  • s/^(.*)(\..*)$/\$1 \[Full\]\$2/: добавляет a [Full] строка перед последним . символ к имени файла

Для применения изменений удалите -n опция от rename команда:

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"
0
ответ дан 1 June 2015 в 00:17

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

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