Имена файлов с пробелами в BASH - PullRequest
13 голосов
/ 19 октября 2010

Я пытаюсь написать скрипт, который будет обрезать и изменять размер больших фотографий в HD-обои.

#! /bin/bash


for i in `ls *.jpg`
do
    width=`identify -format '%w' $i`
    height=`identify -format '%h' $i`

    if [ `echo "$width/$height > 16/9" | bc -l` ]
    then
        exec `convert $i -resize 1920 -gravity Center -crop '1920x1080+0+0' +repage temp`
    else
        exec `convert $i -resize x1080 -gravity Center -crop 1920x1080+0+0 +repage temp`
    fi

    rm $i
    mv temp $i
done

Но похоже, что в скрипте есть проблемы с именами файлов, имеющими пробелы (например, Tumble Weed.jpg). Как я могу это исправить?

Ответы [ 7 ]

21 голосов
/ 19 октября 2010

Во-первых, вам не нужно ls.Используя ls в backtics, вы неявно заставляете bash анализировать строку в списке, который разделяется пробелами.Вместо этого, заставьте bash сгенерировать список и разделить его без таких странностей:

Кроме того, вам нужно заключить все $i использования в кавычки, чтобы заставить bash подставить его целиком, а не как строку, разделенную на отдельныеслова.

Вот сценарий, который демонстрирует обе идеи:

for i in *.jpg ; do 
  echo "$i";
done
14 голосов
/ 19 октября 2010

Используйте read, чтобы обойти проблему с пробелами. Выглядит цикл как-то неестественно, но работает лучше:

find . -type f -iname "*.jpg" | while read i
do
    # your original code inside the loop using "$i" instead of $i
done

с -iname вы также получите файлы jpg, которые могут иметь расширение с другим регистром, например .JPG. «i» в «iname» означает игнорировать регистр.

4 голосов
/ 19 октября 2010

Я бы порекомендовал написать for-line следующим образом:

for i in *.jpg

и заключить в кавычки $i: "$i".


Если вы настаиваетев стиле

`ls *.jpg`

(если вы, например, получаете имена файлов из более сложной команды), вы можете попробовать установить IFS в \n:

IFS='\n'

Сравните эти два исполнения:

$ for f in `ls *`; do echo $f; done
hello
world
test

$ IFS='\n'; for f in `ls *`; do echo $f; done
hello world
test
1 голос
/ 28 июня 2014

В bash используйте замену строки на find:

${string//substring/replacement}
Замените все совпадения $substring на $replacement.

так что это работает:

find . -type f -name '*.jpg' | while read i ; do /bin/mv -f "$i" ${i// /_}; done
0 голосов
/ 06 апреля 2018

Я забыл добавить ссылку, если вы хотите скачать как текстовый файл

или просто скопируйте и вставьте этот текст по необходимости

ПЕРВЫЙ УСТАНОВКА

apt-get install chromium-browser

apt-get install omxplayer

apt-get install terminator

apt-get install nano (if not already installed)

apt-get install zenity (if not already installed)

ТОГДА СОЗДАЙТЕ СУЩЕСТВУЮЩИЙ СЦЕНАРИЙ ВСЕХ ЭТИХ ЛИЧНОСТНЫХ ПИСАНИЙ.

УБЕДИТЕСЬ, ЧТО КАЖДЫЙ СЦЕНАРИЙ ОБОЛОЧКИ - ФАЙЛ .sh, ЗАКОНЧИВШИЙСЯ КАЖДЫЙ ИЗ ЭТИХ СКРИПТОВ, ЧТОБЫ ОТКРЫТЬ КАТАЛОГ, ЧТОБЫ НАЙТИ И ВЫБРАТЬ, ЧТО ХОТИТЕ.

Он запускает фоновый терминал и позволяет вам управлять песней или кино.

КИНО-КЛЮЧИ - КАК СЛЕДУЮЩИЕ; p или пробел для паузы, q для выхода, - & + для звука вверх и вниз, стрелка влево и стрелка вправо для пропуска вперед и назад.

МУЗЫКАЛЬНЫЙ ИГРОК ДЕЙСТВИТЕЛЬНО ТОЛЬКО ИСПОЛЬЗУЕТ ПЕСНЮ И ЭТО CTRL + C И ЕСЛИ ТОЛЬКО ПОСЛЕДНЯЯ ПЕСНЯ ИЛИ ТОЛЬКО ПЕСНЯ, ЧТО ЭТО ВЫКЛЮЧИВАЕТСЯ, И ТЕРМИНАЛ ПРОХОДИТ.

**** ИНСТРУКЦИЯ ПО СОЗДАНИЮ СЦЕНАРИЙ ****

  • ОТКРЫТЬ ТЕРМИНАЛ

  • CD С КАТАЛОГОМ, КОТОРЫМ ВЫ ХОТИТЕ, ЧТОБЫ СКРИПТЫ БЫЛИ

    cd /home/pi/Desktop/
    
  • Откройте редактор NANO с названием оболочки, которое вы хотите

    sudo nano Movie_Player.sh
    
  • ВНУТРИ НАНО, ТИП ИЛИ КОПИЯ / ПРОШЛОЕ (ПОМНИТЕ, ЧТО В ТЕРМИНАЛЕ ВЫ ДОЛЖНЫ УДЕЛАТЬ CTRL + SHIFT + V) SCRITP

  • СОХРАНИТЬ ДАННЫЕ С CTRL + O

    ctrl+o
    
  • HIT ENTER, чтобы сохранить как имя файла или удалить имя файла, затем новый тип, просто убедитесь, что он заканчивается .sh THIT ENTER

  • В СЛЕДУЮЩЕМ ВАМ НУЖНО СУДО ЧМОДАТЬ С + X, ЧТОБЫ СДЕЛАТЬ ЭТО ПРЕИМУЩЕСТВЕННО, КАК БАШ

    sudo chmod +x Movie_Player.sh
    
  • НАКОНЕЦ ЗАПУСКАЙТЕ ЕГО ИСПЫТАТЬ ЛИБО ДВОЙНЫМ НАЖИМАЯ НА ЭТОМ И ВЫБИРАЯ «ВЫПОЛНИТЬ В ТЕРМИНАЛЕ» ИЛИ ./ В ТЕРМИНАЛЕ

    ./Movie_Player.sh
    

ТЕПЕРЬ ХОРОШО ВЫБРАТЬ ФИЛЬМ ИЛИ ВЫБРАТЬ ПЕСНЮ ИЛИ АЛЬБОМ И НАСЛАЖДАТЬСЯ!

**** ВСЕ ЭТИ СЦЕНАРИИ СЧЕТА ДЛЯ ПРОСТРАНСТВ В FILENAME

ТАК ЧТО ВЫ МОЖЕТЕ ДОСТУПИТЬ "ТОМ ПЕТТИ" ИЛИ "ШЕСТНАДЦАТЬ КАМЕНЬ" БЕЗ НЕ ТРЕБУЕТСЯ "_" МЕЖДУ СЛОВАМИ.

------- СМОТРЕТЬ СЦЕНАРИЙ ФИЛЬМА ------- (

#!/bin/bash

FILE=`zenity --title "Pick a Movie" --file-selection`

for FILE in "${FILE[0]}"

do
     omxplayer "${FILE[0]}"
done

-------- СЛУШАТЬ ПЕСНЮ -------

#!/bin/bash

FILE=`zenity --title "Pick a Song" --file-selection`

for FILE in "${FILE[0]}"

do
     play "${FILE[0]}"
done

-------- СЛУШАТЬ АЛЬБОМ ---------- ПЕСНИ В ПОРЯДКЕ

#!/bin/bash

DIR=`zenity --title "Pick a Album" --file-selection --directory` 

for DIR in "${DIR[0]}"

do
  cd "${DIR[0]}" && find . -type f -name '*.ogg' -o -name '*.mp3' | sort --version-sort | while read DIR; do
  play "$DIR"
  done
done

-------- СЛУШАТЬ АЛЬБОМ С ПЕСЕНЯМИ В СЛУЧАЙНОМ ПОРЯДКЕ --------

#!/bin/bash

DIR=`zenity --title "Pick a Album" --file-selection --directory` 

for DIR in "${DIR[0]}"

do
  cd "${DIR[0]}" && find . -type f -name '*.ogg' -o -name '*.mp3' | while read DIR; do
  play "$DIR"
  done
done
0 голосов
/ 19 октября 2010
 #! /bin/bash 
 mkfifo ./lsOutput
 ls -1 *.jpg > ./lsOutput
    while read line  
    do 

    width=`identify -format '%w' "$line"` 
    height=`identify -format '%h' "$line"` 

    if [ `echo "$width/$height > 16/9" | bc -l` ] 
    then 
        exec `convert "$line" -resize 1920 -gravity Center -crop '1920x1080+0+0' +repage temp` 
    else 
        exec `convert "$line" -resize x1080 -gravity Center -crop 1920x1080+0+0 +repage temp` 
    fi 

    rm "$line"
    mv temp "$line"
 done<./lsOutput
0 голосов
/ 19 октября 2010

Используйте двойные кавычки вокруг имен файлов.Как это:

width=`identify -format '%w' "$i"`

Обратите внимание на двойные кавычки вокруг "$i".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...