说我在一个目录中,还有另一个名为带有.jpg图像的图片目录,我希望对“./operation image1.jpg”运行一个操作,如何为目录图片中的每个jpg执行此操作?当我搜索迭代目录中的文件时,我无法获得我想要的输出。
#!/bin/sh
cd pictures
pictures=$ls
for pic in $pictures
do
./operation $pic
done
这就是我的代码。我做错了什么?
答案 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