Различные действия с файлами расширениями в Bash скрипте

Содержание
Введение
Показать все файлы
Показать файлы с определённым расширением
Получить только имя файла без расшения
Получить только расширение файла
Преобразовать изображения в формат .webp
Добавить символы к имени файла
Изменить расширение файлов
Обрезать названия файлов с конца
Похожие статьи

Введение

Перед тем как читать эту статью убедитесь, что вы знакомы с содержанием статьи «Основы Bash»

Показать имена всех файлов в директории

#!/bin/bash for file in ./**; do echo "${file##/}" done

Показать файлы с определёныым расширением

Если нужны только файлы с расширением .jpg

#!/bin/bash for file in ./**.jpg; do echo "${file##/}" done

Получить имя файла без расширения

Если нужно только имя файла без расширения

#!/bin/bash for file in ./**.jpg; do filename="${file%.*}" echo $filename done

Получить только расширение файла

Если нужно только расширение

#!/bin/bash for file in ./**.jpg; do extension="${file##*.}" echo $EXTension done

Преобразовать изображения в формат .webp

Скачать webp

wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.2.0-linux-x86-64.tar.gz
mkdir webp
cp libwebp-1.2.0-linux-x86-64.tar.gz webp/
tar -xvf libwebp-1.2.0-linux-x86-64.tar.gz
cp -r libwebp-1.2.0-linux-x86-64 libwebp-current
cd libwebp-current/bin
pwd
vi ~/.bashrc

export PATH=$PATH:/home/andrei/webp/libwebp-current/bin

#!/bin/bash for file in ./**.jpg; do filename="${file%.*}" newfile=$filename".webp" cwebp -q 60 $file -o $newfile done

Добавить к названиям файлов суффикс

Если нужно сохранить расширение файла, а к оригинальному названию добавить какое-то слово или символ. А сделать это со всеми файлами данного типа в директории

Например в директории есть файлы a.jpg , b.jpg , c.jpg , а нужно сделать из них a--small.jpg , b--small.jpg , c--small.jpg

#!/bin/bash POSTFIX="--small" # что вы хотите добавить EXT=".jpg" # к каким файлам for file in ./**$EXT; do fullname="${file##/}" filename="${file%.*}" temp=$filename$POSTFIX mv $file ${temp}$EXT done

А теперь скрипт, который делает и то и другое, а перед тем как делать проверяет нет ли уже такого файла

#!/bin/bash # # After this script is used all .jpg and .png images that did not have # --small. versions will get one # afterwards all .jpg and .png images will get their .webp version # including those --small version that were created by this script # # At the very end each image will have 4 versions: # original # postfixed # original .webp # postfixed .webp POSTFIX="--small" DOT="." for file in ./*; do EXT="${file##*.}" # echo $EXT if [[ $EXT = "jpg" ]] || [[ $EXT = "png" ]]; then # all images will without .webp version fullname="${file##/}" # echo $fullname filename="${file%.*}" # echo $filename webp_file=$filename".webp" if test -f "$webp_file"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $webp_file exists" >> image_proc.log else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $file to $webp_file" >> image_proc.log cwebp -q 60 $file -o $webp_file # echo "no webp" fi # do not add postfix to files that already have one existing_postfix="${filename: -7:7}" if [[ $existing_postfix != "--small" ]]; then # check if this file already has prefixed version small_candidate=$filename$POSTFIX$DOT$EXT if test -f "$small_candidate"; then # file with a postfix already exists. # And its .webp version existed or was created # at previous step echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $small_candidate already exists.\ No need to add $POSTFIX to $filename" >> image_proc.log else # create new file with prefix echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ \ "Copy $file to $small_candidate" >> image_proc.log cp $file $small_candidate # check if its .webp version already exists webp_small_candidate=$filename$POSTFIX$DOT"webp" if test -f "$webp_small_candidate"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $webp_small_candidate already exists." else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $small_candidate to $webp_small_candidate" >> image_proc.log cwebp -q 60 $small_candidate -o $webp_small_candidate fi fi else # check if this file with postfix has a webp version echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $filename :ignored - already has --small postfix" >> image_proc.log fi else echo $(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $EXT" :ignored as it is not jpg or png" >> image_proc.log fi done #!/bin/bash # # After this script is used all .jpg and .png images that did not have # --small. versions will get one # afterwards all .jpg and .png images will get their .webp version # including those --small version that were created by this script # # At the very end each image will have 4 versions: # original # postfixed # original .webp # postfixed .webp POSTFIX="--small" DOT="." for file in ./*; do EXT="${file##*.}" # echo $EXT if [[ $EXT = "jpg" ]] || [[ $EXT = "png" ]]; then # all images will without .webp version fullname="${file##/}" # echo $fullname filename="${file%.*}" # echo $filename webp_file=$filename".webp" if test -f "$webp_file"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $webp_file exists" >> image_proc.log else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $file to $webp_file" >> image_proc.log cwebp -q 60 $file -o $webp_file # echo "no webp" fi # do not add postfix to files that already have one existing_postfix="${filename: -7:7}" if [[ $existing_postfix != "--small" ]]; then # check if this file already has prefixed version small_candidate=$filename$POSTFIX$DOT$EXT if test -f "$small_candidate"; then # file with a postfix already exists. # And its .webp version existed or was created # at previous step echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $small_candidate already exists.\ No need to add $POSTFIX to $filename" >> image_proc.log else # create new file with prefix echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ \ "Copy $file to $small_candidate" >> image_proc.log cp $file $small_candidate # check if its .webp version already exists webp_small_candidate=$filename$POSTFIX$DOT"webp" if test -f "$webp_small_candidate"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $webp_small_candidate already exists." else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $small_candidate to $webp_small_candidate" >> image_proc.log cwebp -q 60 $small_candidate -o $webp_small_candidate fi fi else # check if this file with postfix has a webp version echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $filename :ignored - already has --small postfix" >> image_proc.log fi else echo $(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $EXT" :ignored as it is not jpg or png" >> image_proc.log fi done

Изменить расширение файлов

Допустим у вас есть картинки JPG и jpg а нужно, чтобы все были jpg

#!/bin/bash for file in ./*; do EXT="${file##*.}" # echo $EXT if [[ $EXT = "JPG" ]]; then # all images will without .webp version fullname="${file##/}" # echo $fullname filename="${file%.*}" # echo $filename jpg_file=$filename".jpg" if test -f "$jpg_file"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $jpg_file exists" >> JPG_to_jpg.log else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $file to $jpg_file" >> JPG_to_jpg.log mv $fullname $jpg_file # echo "no webp" fi fi done

Более читаемый вариант - старое и новое расширение задаются в начале скрипта.

#!/bin/bash OLD_EXT=PNG NEW_EXT=png LOG_FILE=case_change.log for file in ./*; do EXT="${file##*.}" # echo $EXT if [[ $EXT = "$OLD_EXT" ]]; then fullname="${file##/}" # echo $fullname filename="${file%.*}" # echo $filename new_file=$filename".$NEW_EXT" if test -f "$new_file"; then echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ $new_file exists" >> $LOG_FILE else echo "$(date '+%Y-%m-%d %H:%M:%S,%3N')" ____ "\ Converting $file to $new_file" >> $LOG_FILE mv $fullname $new_file fi fi done

Обрезать названия файлов с конца

Допустим у вас есть картинки jpg и png из названия которых нужно удалить суффикс --big

В этом скрипте будем проверять расширение не условием ИЛИ а на принадлежность к массиву

#!/bin/bash EXTENSIONS=(jpg png) REMOVABLE="--big" DOT="." for file in ./*; do EXT="${file##*.}" if [[ " ${EXTENSIONS[*]} " =~ " ${EXT} " ]]; then FILENAME="${file%.*}" fivelast=${FILENAME: -5} if [[ $fivelast = $REMOVABLE ]]; then mv "$file" "${file/$REMOVABLE/}" fi fi done

Похожие статьи
Bash
Основы Bash
alias: Псевдонимы
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date: Дата
Переход на новую строку
Арифметические операции
sftp: Передать файл или пароль в Bash скрипте
Мониторинг потребления памяти
Работа с файлами в директории
awk
grep
sed
Ошибки Bash
Zsh

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: