微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bash,循环目录

我有一个关于bash如何工作的根本问题,以及一个相关的实际问题.

基本问题:假设我在一个目录中有三个子目录:a,b和c.

母鸡代码

for dir in $(ls)
do 
    echo $dir
done

吐出来

a b c
a b c
a b c

即dir始终存储我的cwd中的所有文件/目录的列表.我的问题是:为什么在世界上这样会很方便?在我看来,dir存储每个元素一次是更有用和直观的,也就是说我想要输出

a
b
c

另外,根据一个答案 – 在$(ls)中使用dir是错误的,但是当我在$(ls -l)中使用dir时,我会获得更多的abc副本(比目录/文件更多在cwd).这是为什么?

我的第二个问题是实用的:我如何循环我的cwd中以资本W开头的所有目录(而不是文件!)?我开始

for dir in `ls -l W*`

但是这是因为a)问题1和b)的原因,因为它不排除文件.建议赞赏

从来没有解析过这样的输出( Why you shouldn’t parse the output of ls(1)).

此外,您的语法错误.你不是(),你的意思是$().

就是说,要循环使用W开头的目录(或者使用find命令,取决于你的方案):

for path in /my/path/W*; do
    [ -d "${path}" ] || continue # if not a directory,skip
    dirname="$(basename "${path}")"
    do_stuff
done

至于从恶魔ls循环得到的输出,它不应该是这样的.这是预期的输出,并演示为什么你不想使用ls在第一个地方:

$find
.
./c
./a
./foo bar
./b

$type ls
ls is hashed (/bin/ls)

$for x in $(ls); do echo "${x}"; done
a
b
c
foo
bar

原文地址:https://www.jb51.cc/bash/383952.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐