(Linux)将变量格式化为printf列

时间:2017-10-23 23:58:20

标签: linux bash printf

我试图在3列中显示文件名,大小和类型。数据没有正确显示,我只是不明白为什么。

这是我的代码:

    fileName=$(ls -a ~/dirname)
    fileSize=$(find ~/dirname/* -printf '%s\n';)
    fileType=$(find ~/dirname/* | xargs file |  awk '{print $3}')

    printf " ----------------------------------------------------------\n"
    printf "%15s %15s %15s\n" "Name" "Size" "Type"
    printf " ----------------------------------------------------------\n"
    printf "%15s  %15s  %15s\n" "$fileName" "$fileSize" "$fileType"


输出显示如下: (仅作为图像输出以避免堆栈溢出格式化)

Output Screenshot

2 个答案:

答案 0 :(得分:0)

您的变量每个都包含所有文件的信息,但您一次打印它们,而不是将它们分开。此外,find返回的文件顺序与ls的顺序不同(按字典顺序对它们进行排序)。

您需要遍历文件并在不同的行上打印每个文件:

printf "%15s %15s %15s\n" "Name" "Size" "Type"
printf " ----------------------------------------------------------\n"
ls -a ~/dirname | while read -r fileName
do
    fileSize=$(stat --format=%s "$fileName")
    fileType=$(file "$fileName" | awk '{print $3}')
    printf "%15s  %15s  %15s\n" "$fileName" "$fileSize" "$fileType"
done

答案 1 :(得分:0)

我在巴马尔的一些帮助下解决了这个问题,确定我做错了什么:

    for fileName in $(ls -a ~/dirname/*);
    do
            fileSize=$(stat --printf="%s" "$fileName")
            fileType=$(file "$fileName" | awk '{print $3}')
            printf "%15s  %15s  %15s\n" $(basename "$fileName") "$fileSize" "$fileType"
    done