在 Bash 脚本中,如何横向进入当前目录中的目录?

在 Bash 脚本中,如何横向进入当前目录中的目录?

所以我当前的代码如下:scan.h

#!/bin/bash
while IFS= read -r line;
do
    byte=$(stat -c%s "$line");
    echo "$line : $byte";
done< <(ls *.$1)

在 UNIX 中,一旦我运行我的代码,它会像这样执行:

./scan.sh cpp
arraysum.cpp : 359
countLines.cpp : 1199
createtext.cpp : 240
multiproc1.cpp : 196
myWc.cpp : 1230
test.cpp : 193

这是预期的,因为它显示了当前目录中的所有 .cpp 文件,后跟它们的字节数。但是,我还想找到目录文件夹中的其他文件,但我似乎不知道如何横向进入它们。

旁注:也只是出于好奇,我是否可以根据字节大小整理我的打印语句?

答案1

一般来说,您会使用find递归搜索目录,例如

find . -name '*.cpp'

如果您有 GNU find,您可以直接打印出文件名和大小(以字节为单位),从而避免调用stat

find . -name '*.cpp' -printf '%f:%s\n'

如果您不介意颠倒顺序,则可以以明确可排序的方式输出结果 - 例如按大小从高到低进行数字排序

find ../src -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn

您始终可以在排序后交换字段,例如使用 Awk - 这也允许您仅选择前 5 个结果,例如:

find . -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn | awk -F: 'NR==6 {exit} {print $2 " : " $1}'

最后,如果您想让任何“合法”文件名(包括带有换行符的文件名)安全,请使用 null 终止所有内容

find . -name '*.cpp' -printf '%s:%f\0' | sort -t: -zrn | awk -vRS='\0' -F: 'NR==6 {exit} {print $2 " : " $1}'

相关内容