1

У меня много папок, некоторые только с mp3-файлами, другие только с файлами m4a, другие с файлами обоих расширений.

Мне нужно определить, какие папки имеют файлы в обоих расширениях, а затем переместить mp3-файлы в другую папку, оставив только файлы m4a. Если в папке есть файл, отсутствующий в обоих расширениях, ничего не должно произойти.

Я изучаю оболочку в течение некоторого времени, но у меня нет возможности сделать что-то подобное. Если у меня будет какой-либо прогресс, я все равно буду обновлять здесь.

4 ответа4

2

mv выдаст файл не найденные ошибки, но это должно работать

ls -1 *.m4a | sed 's#\(.*\).m4a#mv \1.mp3 otherdir#' | sh
2

Если я правильно понял, то вам просто нужно найти файлы .mp3 и переместить те, для которых существует эквивалентный файл .m4a в тот же каталог. Следующий скрипт bash сделает это, но он не найдет дублирующиеся пары файлов MP3/M4A, которые существуют в разных каталогах друг от друга. Обратите внимание, что важно правильно указывать в кавычках переменные, потому что музыкальные файлы часто имеют много пробелов в своих именах, а bash интерпретирует пробелы как отдельные элементы в списках.

#!/bin/bash

# Name of directory under which you music is stored.
SOURCE_DIR=/path/to/current/music/dir

# Name of directory you want to move the MP3s to.
DEST_DIR=/path/to/mp3/destination/dir

# Create the destination directory for the moved MP3s, if it doesn't already exist.
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR

# Search for .mp3 files starting in $SOURCE_DIR
find $SOURCE_DIR -type f -name "*.mp3" | while read fin
do

  # Create the equivalent file name with .m4a extension.
  fm4a=${fin/.mp3/.m4a}

  # If a file with .m4a extension exists, move the .mp3 file to the destination dir.
  # In the event of a file name clash in the destination dir, the incoming file has
  # a number appended to its name to prevent overwritng of the existing files.
  [ -f "$fm4a" ] && mv -v --backup=numbered "$fin" $DEST_DIR/
done

##
## End of script.
##

Перед запуском этой версии я предлагаю заменить строку перед done следующей строкой как пробный прогон, чтобы вы могли получить представление о том, что будет перемещено:

  [ -f "$fm4a" ] && echo "Moving $fin to $DEST_DIR/"

(См. Комментарии, исправляющие мое опасное использование find и while .)

0

Я не могу придумать способ сделать это в оболочке; и даже если бы вы могли, это было бы очень ограничено по сравнению с тем, чего могла достичь программа. Я точно знаю, что программа очистки дубликатов (цифровой вулкан) может искать музыкальные файлы и переносить mp3-версию любого дубликата в другое место. Это делает нечеткое соответствие тоже. http://download.cnet.com/Duplicate-Cleaner/3000-2248_4-10584403.html?part=dl-&subj=dl&tag=button посмотреть рекламное ПО при установке ...

0

Это решение было протестировано на /bin /bash из системы GNU /Linux. Я предполагаю, что на вашем компьютере для этого есть /bin /bash, а также awk, tr, grep, ls, rm и wc. (/bin /bash является исполняемым файлом оболочки по умолчанию). Этот скрипт также предполагает, что у вас есть ТОЛЬКО файлы mp3 и m4a, и что некоторые каталоги не содержат файлов mp3 и m4a. (написал это на

Опять же, это предполагает, что Mac имеет bash, tr, grep, ls, rm и wc (стандартные утилиты UNIX, iirc)

(извините за плохие сценарии, я не очень хорош в сценариях оболочки)

(каталог = папка)

(Укажите каталог назначения, используя ПЕРВЫЙ АРГУМЕНТ) (т.е. ./thisscript.sh имя_каталога)

(прежде чем сделать это, прочитайте весь пост)

Создайте текстовый файл в родительском каталоге всех этих каталогов с музыкой в нем и вставьте его в:http://pastebin.com/HcAvWtG0 Теперь перейдите к этому каталогу в оболочке и введите:

bash <filename>

Обратите внимание, что вы не можете сделать что-то сложное, как это без сценария. ;)

Прогуливаясь через это:

#!/bin/bash

Говорит нам использовать /bin /bash, оболочку.

todir=$1

Разобрать первый аргумент как каталог назначения и сохранить его в $ todir (переменная).

cd $( dirname $0 )

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

DIRLIST=$( ls -F | grep '/' | tr -d '/' )

Список каталогов.

for DIR in $DIRLIST
do

Итерация по каталогам.

    mp3num=$( ls $DIR | grep -c \\.mp3 )
    m4anum=$( ls $DIR | grep -c \\.m4a )
    filnum=$( ls $DIR | wc -l )

Сохраните некоторые переменные, которые нам нужны (количество mp3, количество m4a, количество файлов

    echo $DIR $mp3num $mp4num $filnum

(только для отладки)

    if [ $DIR = $todir ]; then
        continue
    fi

Если каталог, на который мы смотрим на текущей итерации, пропустите его.

    if [ $m4anum = 0 -o $mp3num = 0 ]
    then
        continue

Если в каталоге нет ни m4a, ни mp3, пропустите его.

    elif [ $mp3num != 0 -a $m4anum != 0 ]
    then
        mv $DIR/*.mp3 $todir

Если в каталоге есть несколько mp3-файлов и несколько m4a, то переместите все mp3-файлы из каталога в указанную папку назначения.

    fi
done

Были сделаны.

Причина, по которой это, вероятно, будет работать и на macs, заключается в том, что macs основан на Unix. У них также есть bash, язык оболочки, который мы здесь используем, и все эти маленькие утилиты Unix (я посмотрел их, и они появились как первый результат в Mac Manpages).

Кроме того, убедитесь, что каталог назначения существует, или он не будет работать ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .