Читая руководства по пакетному переименованию файлов в bash и используя sort
команду для сортировки содержимого файла, я не смог понять, как их объединить.
У меня есть каталог, содержимое которого отсортировано с помощью тегов в имени файла, подобно тому, как программа TagSpaces обрабатывает вещи. Я добавляю любые теги, которые могу придумать, в конец имени файла при его создании или загрузке. Вот пример:
Sunrise (2) #wallpaper #4k #googleimages.jpg
Теперь я хочу просмотреть все эти файлы и переименовать их, чтобы теги сортировались в алфавитном порядке, не затрагивая ничего до или после тегов (например, заголовок изображения или расширение файла). Таким образом, вышесказанное станет:
Sunrise (2) #4k #googleimages #wallpaper.jpg
Как мне это сделать? Я даже не могу понять, как передать имя файла , а не его содержимое, в такую команду sort
, чей вывод я мог бы затем передать mv
.
Ответы:
Тестирование:
источник
Если у вас есть perl-based
rename
(prename
в некоторых системах), вы можете сделать split + сортировать теги, используя perl. Например, учитываязатем (с каким-то уродливым спором убрать и заменить
.jpg
суффикс)проверка
Вероятно, есть много возможностей для улучшения, но я надеюсь, что это даст вам некоторое представление.
источник
С
zsh
:(удалить
-n
(всухую), если счастлив).[^#]#
: 0 или более не # символов (#
как*
в регулярных выражениях)s: :
разделить на пространствоo
: заказ (сортировка)j: :
: присоединиться к пробелуИтак, мы разделяем часть между первым
#
(включенным) и последним.
(исключенным) в пространстве, сортируем результирующий список, который мы объединяем с пробелом.Рекурсивный:
Чтобы разрешить пробелы в именах тегов, мы можем разделить
#
и обрезать конечные пробелы, отсортировать и объединить#
с помощью:Добавьте
(#qD)
спецификатор glob, если вы также хотите обрабатывать скрытые файлы (D
ot файлы) или хотите обрабатывать файлы в скрытых каталогах.источник
Хороший вопрос!
Вот мой простой
bash
скрипт для этого:Объяснение:
В
afile=( ${file#*)} );
: мы конвертируем строку в массив. В этом состоянии оболочка выполняет разбиение слов на пробелы, если вы не заключите строку в кавычки.В
${file#*)}
( cut-up-to-first-prefix ): мы убираем все с начала строки до первого,)
увиденного, используя,shell parameter expansion
поскольку это приведет к#wallpaper #4k #googleimages.jpg
рассмотрениюfile="Sunrise (2) #wallpaper #4k #googleimages.jpg"
В
${file%%#*}
( сокращение до последнего суффикса ); зачистка начала с конца до начала строки до последнего#
раза. это приведетSunrise (2)
In
${afile[@]%%.*}
( cut-up-to-last-суффикс ): то же, что и выше, разделение начинается с конца до начала строки (здесь в каждом индексированном массиве) до последнего.
увиденного. это приведет#wallpaper #4k #googleimages
, мы могли бы также использовать${afile[@]%.*}
лучше!В
printf "%s\n" "${afile[@]%%.*}"
: мы печатаем элементы массива с символами новой строки ([@]
используется для индексированного массива), (почему с символами новой строки? Потому что мы отсортируем их, и мы должны разбить элементы на новые строки)В
$(sort<(printf "%s\n" "${afile[@]%%.*}"))
: мы сортируем элементы (или теги).In
$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}")))
: то же, что и выше, но мы использовали дополнительнуюecho
команду для объединения отсортированных элементов в одну линейную.возможно то же самое с использованием двойного
xargs
лайка... |xargs -n1| sort | xargs
.Пожалуйста, смотрите ниже пример, чтобы лучше понять этот шаг:
Наконец, в конце
mv
команда переименовывает$file
в измененное имя.Ps: удалить
echo mv ...
передmv
выходом из пробного прогона и выполнить фактическое переименование.источник
Это кажется слишком сложным для Bash, чтобы быть честным. Это не невозможно, но, на мой взгляд, вам гораздо лучше использовать язык, созданный для «настоящего» программирования. Решение Bash, скорее всего, будет неприемлемым. (Не пытаясь оскорбить решение Bash-only, я думаю, что волшебство переименования на самом деле довольно удивительно)
Тем не менее, вот решение с Руби. Вы можете записать его в файл, а затем просто запустить файл из вашей оболочки, учитывая, что у вас установлен Ruby.
Чтобы выполнить сценарий, просто поместите его в каталог, в котором находятся ваши изображения. Это решение должно быть достаточно устойчивым к глупым именам изображений и таким тегам,
C#
которые не вызовут проблем. Тем не менее, не забудьте сделать резервную копию перед запуском скрипта. Операции движения могут быть столь же разрушительными, как иrm
.источник