1

假设我在一个目录中,并且还有一个名为图片的目录,里面有 .jpg 图像,我想对“./operation image1.jpg”运行一个操作,我该如何为目录图片中的每个 jpg 执行此操作?当我搜索遍历目录中的文件时,我无法获得我想要的输出。

#!/bin/sh

cd pictures
pictures=$ls

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

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

4

3 回答 3

3

不要ls用于获取文件列表,因为这不适用于文件名中的空格。它变成了这样的东西:

my file.jpg
another file.jpg

进入:

my
file.jpg
another
file.jpg

让我们bash处理 fil 列表,您就不会遇到这个问题。只需记住引用每个文件,以便完整保留其中包含空格的文件:

#!/bin/sh
cd pictures
for pic in *.jpg ; do 
    ./operation "$pic"
done
于 2012-04-07T05:09:24.900 回答
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
于 2012-04-07T06:25:52.497 回答
1

find pictures/ -type f -name '*.jpg' -exec \./operation {} \;
于 2012-04-07T06:02:13.033 回答