BASH中带空格的文件名

时间:2010-10-19 11:10:00

标签: linux bash

我正在尝试编写脚本来裁剪并将大型照片调整为高清壁纸。

#! /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 个答案:

答案 0 :(得分:21)

首先,您不需要ls。通过在backtics中使用ls,您可以隐式地将bash解析为一个列表,该列表按空格分割。相反,make bash生成列表并将其分开,没有这样的怪癖:

此外,您需要将所有$i个用法括在引号中,以使bash将其替换为整体,而不是将其拆分为单独的单词。

以下是演示这两个想法的脚本:

for i in *.jpg ; do 
  echo "$i";
done

答案 1 :(得分:14)

使用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文件。 “in”中的“i”表示忽略套管。

答案 2 :(得分:4)

我建议像这样编写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

答案 3 :(得分:1)

在bash中,使用find替换字符串:

  

${string//substring/replacement}
  将$substring的所有匹配替换为$replacement

这样可行:

find . -type f -name '*.jpg' | while read i ; do /bin/mv -f "$i" ${i// /_}; done

答案 4 :(得分:0)

在文件名周围使用双引号。像这样:

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

请注意"$i"附近的双引号。

答案 5 :(得分:0)

 #! /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

答案 6 :(得分:-1)

如果您想将download作为txt文件

,我忘了添加链接

或只是根据需要复制并粘贴此文本

首先安装

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文件,其中每个脚本都会被打开以打开目录,以便找到并选择您想要的内容。

IT RUNS背景终端&amp;允许你控制歌曲或电影。

MOVIE KEYS如下; p或空格键表示暂停,q表示退出, - &amp; +用于上下声音,左箭头和右箭头用于向前和向后跳跃。

音乐播放器真的只有一个跳音歌,而且是CTRL + C,如果这是最后一首歌,或者只有当它关闭并且终端走了。

****制作脚本的说明****

  • 打开终端

  • CD到目录你想要的文字

    cd /home/pi/Desktop/
    
  • 以你想要的标题打开纳米编辑器

    sudo nano Movie_Player.sh
    
  • INSIDE NANO,TYPE OR COPY / PAST(记住,你需要按住CTRL + SHIFT + V)SCRITP

  • 使用CTRL + O保存数据

    ctrl+o
    
  • HIT输入保存为文件名或删除文件名,然后新类型必须确保它结束.sh然后输入

  • 下一步你需要用+ X来彻底解决这个问题,让它变得像石头一样

    sudo chmod +x Movie_Player.sh
    
  • 最后通过双击并选择“在终端执行”或通过./在终端进行测试来进行测试

    ./Movie_Player.sh
    

你现在可以拍摄电影或选择歌曲或专辑并享受!

****所有这些脚本帐户中的文件帐号

所以你可以访问“TOM PETTY”或“SIXTEEN STONE”,而不需要在单词之间加上“_”。

-------观看电影剧本-------(

#!/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