Bash for循环读取命令shell脚本
我目前正在编写一个脚本,该脚本打印目录,在每个目录旁边列出特定目录的内容,并用逗号分隔 应该是这样的:Bash for循环读取命令shell脚本,bash,shell,Bash,Shell,我目前正在编写一个脚本,该脚本打印目录,在每个目录旁边列出特定目录的内容,并用逗号分隔 应该是这样的: 目录:DirectoryX文件:FileA、FileB、FileC 目录:目录文件:文件,文件E,文件F 目录:DirectoryZ文件:FileG、FileH、FileI 这是我的剧本: #!/bin/bash for i in $(ls -d */) do echo "Directory:" ${i%%/} echo "Files:" $(ls -m *.*)
- 目录:DirectoryX文件:FileA、FileB、FileC
- 目录:目录文件:文件,文件E,文件F
- 目录:DirectoryZ文件:FileG、FileH、FileI
#!/bin/bash
for i in $(ls -d */)
do
echo "Directory:" ${i%%/}
echo "Files:" $(ls -m *.*)
done
它列出了应该列出的文件夹,但当涉及到文件时,它只为每个文件夹列出了相同的两个文件
我还考虑在for循环中加入另一个for循环,但我不确定是否有必要
有人能给我指出正确的方向吗
谢谢您可以使用下面的代码在Bash上工作 编辑:由于人们不愿意解析ls,我已经修改为只使用find。
#/bin/bash
all_dirs=$(find./-typed2>/dev/null);
读目录时
做
files=$(查找$dir-maxdepth 1-type f-printf“%f\n”| tr'\n',“| sed's/,$//g”);
如果[!-z$文件]
然后
echo“目录:$dir-文件:$files”
其他的
echo“目录:$dir为空!!”
fi
完成您的主要问题在于这不是MS-DOS,文件名不一定包含
。使用*
匹配所有文件
此外,不需要使用ls
生成所有目录的列表,bash
可以通过*/
很好地实现这一点
另外,ls
不需要参数来列出所有文件,因此这可以实现以下功能:
for i in */
do
echo -n "Directory: ${i%%/} "
cd "$i" && { echo "Files: $(ls -m)"; cd -; }
done
您需要将cd
(或者pushd
可能更好)插入每个目录,或者将目录前缀添加到循环中的ls
,或者将目录传递到ls
,例如:$(ls-m-“${i}”*)
N.B。这不是MSDOS:*匹配所有不以
开头的文件,所以没有必要使用*.
。你考虑过使用树这样的工具吗?或者输出结构是一种要求吗?避免使用为i在$(..)
模式中使用:不要像这样使用ls
或find
的输出。这里有很多关于你为什么不解析ls
的解释:我已经修改过了。您好,当我使用你的脚本时,我得到的是这样的东西:目录:桌面。/file10:5:cd:can't-cd-to-Desktop目录:Documents。/file10:5:cd:can-cd-to-Documents file10是包含脚本的文件吗?ThanksI设法改变了它一点,现在我得到:-目录:图片文件:-/home/all/user我如何摆脱出现在每个目录下的链接?ls-m
列出了目录中的所有元素。如果您只想显示例如文件,您可以/应该使用find“$i”-type f
而不是cd“$i”…
(请参阅man find
,了解所有可能的类型)
for i in */
do
echo -n "Directory: ${i%%/} "
cd "$i" && { echo "Files: $(ls -m)"; cd -; }
done