Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash for循环读取命令shell脚本_Bash_Shell - Fatal编程技术网

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