for循环读取命令shell脚本

时间:2017-11-20 14:50:03

标签: bash shell

我目前正在编写一个打印目录的脚本,每个目录旁边列出该特定目录的内容并用逗号分隔。

它应该是这样的:

  • 目录:DirectoryX文件:FileA,FileB,FileC
  • 目录:DirectoryY文件:FileD,FileE,FileF
  • 目录:DirectoryZ文件:FileG,FileH,FileI

这是我的剧本:

#!/bin/bash


for i in $(ls -d */)

 do 

echo "Directory:" ${i%%/} 


    echo "Files:" $(ls -m *.*) 


done

它列出了应该执行的文件夹,但是当涉及到文件时,它只为每个文件夹列出了相同的两个文件

我还考虑过将另一个for循环放入for循环但是我不确定是否有必要

有人能指出我正确的方向吗?

由于

2 个答案:

答案 0 :(得分:1)

您的主要问题在于,这不是MS-DOS,文件名不一定包含.。使用*匹配所有文件。

此外,无需使用ls来生成所有目录的列表,bash可以使用*/完成此操作。

此外,ls不需要参数来列出所有文件,因此这可以解决问题:

for i in */
do
  echo -n "Directory: ${i%%/} "
  cd "$i" && { echo "Files: $(ls -m)"; cd -; }
done

答案 1 :(得分:-2)

您可以使用以下代码,该代码适用于Bash。

编辑:由于人们决定不解析ls,我修改为只使用find。

 #!/bin/bash

all_dirs=$( find ./ -type d 2>/dev/null );

while read dir
do
    files=$( find  $dir -maxdepth 1 -type f -printf "%f\n" | tr '\n' ',' | sed 's/,$//g' );
    if [ ! -z $files ]
    then
        echo "Directory : $dir - File :  $files"
    else
        echo "Directory : $dir IS EMPTY!!"
    fi
done <<< "$all_dirs"

问候!