Linux 如何使用bashshell处理目录中的文件
假设我的目录如下:Linux 如何使用bashshell处理目录中的文件,linux,bash,shell,unix,Linux,Bash,Shell,Unix,假设我的目录如下: dir | |--- sub1 | | | |------filea.jpg | |------fileb.jpg | | |--- sub2 | |------filec.jpg |------filed.jpg |------sub21 | |-------filee.jpg 我需要做的是将位于同一目录中的所有文
dir
|
|--- sub1
| |
| |------filea.jpg
| |------fileb.jpg
|
|
|--- sub2
|
|------filec.jpg
|------filed.jpg
|------sub21
|
|-------filee.jpg
我需要做的是将位于同一目录中的所有文件作为一个参数传递给某个可执行文件。例如,对于上述情况,我需要:
upload.sh dir/sub1/filea.jpg dir/sub1/fileb.jpg
upload.sh dir/sub2/filec.jpg dir/sub2/filed.jpg
upload.sh dir/sub2/sub21/filee.jpg
我不擅长linux shell,我所做的是用脚本列出所有这些脚本:find dir -type f | while read myfile; do
echo $myfile
done;
如何根据需要制作脚本?使用
find
查找目录,然后对目录中的所有文件执行命令。在通配符中使用已知扩展名以防止它包含子目录
shopt -s nullglob
find dir -type d | while read dir; do
files=("$dir"/*.jpg)
if [ ${#files[@]} -gt 0 ]
then upload.sh "${files[@]}"
fi
done
文件名是否有区别于子目录的模式?@Barmar是的。所有文件名都有一个扩展名。例如,filea.jpg、fileb.jpg、的可能重复项等。它不适用于sub21。这意味着它只适用于第一级子目录。可能问题是
upload.sh
不适用于子目录。如果我删除整个sub1和sub2/filec和sub2/field,它就不起作用,这意味着只有dir/sub2/sub21/filee.jpg
我将upload.sh更改为echo,结果包括dir/*.jpg,我认为应该删除这一行。这将导致错误,因为它找不到任何匹配的文件。但它仍应继续处理其他目录。是否使用set-e
在出现错误时中止脚本?有关如何测试目录中是否包含与通配符匹配的文件的信息,请参阅。您可以在循环中放入if
语句。