2016-04-04 7 views
0

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

С одной стороны, я хочу попробовать что-то вроде mv *someSongN* 01-{reference original name here}. Я не понимаю, во втором аргументе mv, как я ссылаюсь на исходное имя файла, но с 01-.

Другая проблема, которую я пробовал, - создать временную переменную bash, за которой следует команда mv. Я проверил это, создав тестовый файл без расширения - touch test. Я нашел echo и mv относиться к шаблону по-разному. Итак, притворитесь, что тестовый файл является единственным в начале каталога te ... var=te*; echo $var возвращает test, но var=te*; mv $var $var.txt возвращает te*.txt. Итак, какую стратегию я использую здесь. Я мог бы также сделать это с графическим файловым менеджером, но я сделал это раньше и счел это очень утомительным.

+0

Вы пробовали с помощью 'find' команду? Вы можете запустить 'find' с помощью подстановочных знаков, и это возвращает имя файла, которое вы могли бы установить как переменную. – bluerojo

+0

У треков есть [ID3-теги] (https://en.wikipedia.org/wiki/ID3) внутри них? – dawg

+1

thx, @bluerojo. – cfye14

ответ

0

ли это как периодический процесс. Создайте файл карты с столбцами fromName toName, запустите сценарий для переименования.

while read a b; do mv "$a" "$b"; done < filemap 

создать filemap, LS и вставить

ls -1 > files; paste files files > filemap; rm files 

и вручную редактировать файл filemap добавить необходимые префиксы.

+0

получить недопустимую опцию - '' 'error – cfye14

+0

Где? В 'ls -1'? – karakfa

+0

ah справа, во время операции 'mv'. Я попытался изменить разделитель в 'filemap' безрезультатно. – cfye14

0

Ниже приведен пример использования команды find

#!/bin/bash 
if [[ $1 = "" ]] ; then 
    echo "Please run the command specifying the filename you are searching for..." 
    exit 
fi 
for i in $(find . -type f -name "$1" | tr -d './') ; do 
    echo ${i} 
    mv ${i} 01-${i} 
done 

Вы бы затем запустить ...

./scriptName "*someSongN*" 
+0

Вы можете превратить '01' в другую переменную, которая находится в цикле, так что у вас будет 01-filename 02-Filename 03-Filename и т. Д. И т. Д. – bluerojo

+0

, поэтому обычно' find' выводит текущий каталог, например './Thisisafile', поэтому есть способ, чтобы найти, чтобы исключить это. Я мог бы добавить 'cut -c 3-' в трубу, но eh – cfye14

+0

, если у меня получится шанс, я продолжу. Полезный на протяжении всего сообщения, только что нашел ответ karafka немного более эффективным. – cfye14

0

, когда вы просто хотите переместить один файл, вы можете создать (инлайн) функцию, как

$ mvd() { mv $1 $2$1; } 

и использовать его как

$ mvd test.mp3 01- 

который перемещает файл test.mp3 в 01-test.mp3.


Используя find, вы можете сделать эту операцию на нескольких файлах, но это приведет все файлы, начиная с только один префиксом (find . -type f -name ${pattern} -exec mvd {} ${prefix}).

Другой вариант использует find . -type f -name ${pattern} и перебирает его, используя for. Затем, вы можете реализовать счетчик:

$ i=0; for file in $(find . -type f -name ${pattern}); do mv $file $i-$file; let i+=1; done 

Привет Fabian

+0

thx. Я не могу заставить это работать, но я могу использовать эту функцию для отдельных случаев. Также кажется, что требуется больше работы [здесь] (https://stackoverflow.com/questions/4321456/find-exec-a-shell-function), чтобы использовать пользовательскую функцию bash с find -exec. – cfye14

+0

с циклом for, как бы я справился с изменением шаблона? – cfye14