Различные действия с файлами расширениями в Bash скрипте
Введение
Перед тем как читать эту статью убедитесь, что вы знакомы с содержанием статьи «Основы Bash»
Показать имена всех файлов в директории
Назовем скрипт для вывода имён всех файлов директории list_sites.sh
#!/bin/bash
for file in ./**; do
echo "${file##/}"
done
Применим этот скрипт к директории sites следующего вида
sites/ |-- aredel.com |-- heihei.ru |-- list_files.sh `-- testsetup.ru
./list_files.sh
./aredel.com ./heihei.ru ./list_files.sh ./testsetup.ru
Показать файлы с определёныым расширением
Если нужны только файлы с расширением .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 скрипты | |
Основы скриптов | |
Работа с файлами в директории | |
.svg → .png | |
Разрезать mp3 на части Bash | |
Чистка Docker Volume |