假设我在一个目录中,并且还有一个名为图片的目录,里面有 .jpg 图像,我想对“./operation image1.jpg”运行一个操作,我该如何为目录图片中的每个 jpg 执行此操作?当我搜索遍历目录中的文件时,我无法获得我想要的输出。
#!/bin/sh
cd pictures
pictures=$ls
for pic in $pictures
do
./operation $pic
done
这就是我的代码。我究竟做错了什么?
不要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
除了文件名中的空格会导致问题之外,您的脚本也可以工作,但您的图片=$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
还
find pictures/ -type f -name '*.jpg' -exec \./operation {} \;