在Bash中的目录中打印文件名

时间:2012-04-07 05:01:32

标签: bash shell

说我在一个目录中,还有另一个名为带有.jpg图像的图片目录,我希望对“./operation image1.jpg”运行一个操作,如何为目录图片中的每个jpg执行此操作?当我搜索迭代目录中的文件时,我无法获得我想要的输出。

#!/bin/sh

cd pictures
pictures=$ls

for pic in $pictures
do
   ./operation $pic
done

这就是我的代码。我做错了什么?

3 个答案:

答案 0 :(得分:3)

不要使用ls来获取文件列表,因为这对文件名中的空格不起作用。它变成了:

my file.jpg
another file.jpg

成:

my
file.jpg
another
file.jpg

bash处理电影列表,你不会遇到这个问题。只记得引用每个文件,以便其中包含空格的文件保存完整:

#!/bin/sh
cd pictures
for pic in *.jpg ; do 
    ./operation "$pic"
done

答案 1 :(得分:1)

另外

find pictures/ -type f -name '*.jpg' -exec \./operation {} \;

答案 2 :(得分:1)

除了文件名中的空格会导致问题之外,您的脚本也能正常工作,但您的图片= $ ls分配不正确。它应该是pictures = $(ls)...如果您需要考虑变量中的空格,请在其周围加上双引号:“$ var”...另外,不要使用ls作为文件名的来源;它有许多其他方法避免的问题;例如,使用find或shell扩展,如paxdiablo的回答所示。

find可以很好地控制您实际列出的内容,甚至可以处理它。

以下是另外几种方法。

# using find
find -maxdepth 1 -type f -name '*.jpg' -exec ./operation "{}" \;

# using an array
pic=(*.jpg)
for p in "${pic[@]}" ;do
  ./operation "$p"
done

# You can (with care) even use ls ... but why would you?  
# I've just added it here to show the use of IFS (Input Field Seperator)
IFS=$'\n'  # this makes `\n` the only delimiter.
pic=$(ls -1 *.jpg )
for p in $pic ;do
  ./operation "$p"
done