Хороший вопрос!
Вот мой простой bash
скрипт для этого:
for file in *.jpg; do
afile=( ${file#*)} );
echo mv "$file" "${file%%#*}$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}"))).jpg";
done
Пояснение:
Вafile=( ${file#*)} );
:мы преобразовываем строку в массив. В этом состоянии оболочка выполняет разбиение слов пробелами, если вы не берете строку в кавычки.
В${file#*)}
(сократить -до -до -первого -префикса):мы удаляем все от начала строки до первого )
, увиденного с помощью shell parameter expansion
, как это будет результат #wallpaper #4k #googleimages.jpg
с учетомfile="Sunrise (2) #wallpaper #4k #googleimages.jpg"
В${file%%#*}
(сократить -до -до -последнего -суффикса);зачистка начинается с конца до начала строки до последнего #
увиденного. это приведетSunrise (2)
В${afile[@]%%.*}
(сократить -вверх -до -последнего -суффикса):так же, как указано выше, удаление начала с конца до начала строки (здесь в каждом индексированном массиве )до последнего .
видели. это даст #wallpaper #4k #googleimages
, мы также могли бы использовать ${afile[@]%.*}
лучше!
Вprintf "%s\n" "${afile[@]%%.*}"
:мы печатаем элементы массива с символами новой строки ([@]
, используемыми для индексированного массива ), (почему с новыми строками? Потому что мы будем их сортировать, и мы должны разделить элементы на новые строки)
В$(sort<(printf "%s\n" "${afile[@]%%.*}"))
:мы сортируем элементы (или теги ).
В$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}")))
:то же самое, что и выше, но мы использовали дополнительную команду echo
для сбора отсортированных элементов в один линейный.
возможно то же самое с использованием двойного xargs
подобного ... |xargs -n1| sort | xargs
.
Пожалуйста, посмотрите пример ниже, чтобы лучше понять этот шаг:
echo -e "C\n4\nB" |sort
4
B
C
echo $(echo -e "C\n4\nB" |sort)
4 B C
Наконец, в конце, mv
команда переименовывает $file
в измененное имя.
Ps:удалите echo mv...
перед mv
, чтобы выйти из пробного -прогона и выполнить фактическое переименование.
Приведенной выше информации недостаточно для понимания основной причины проблемы. Один из подходов к этому я бы попробовал:
Войдите в текстовую консоль как ваш пользователь. Делать
for((;;)); do ps aux --forest; sleep 0.5s; done >audit
Наблюдайте за выполняемыми процессами. Найдите различия, относящиеся к вашей сессии, должно быть что-то, что не изменилось за все эти минуты. Посмотрите на этот конкретный сценарий или двоичный файл и определите причину.