Bash AWK命令通过使用ls-l查找文件以mb、kb或gb为单位打印大小

Bash AWK命令通过使用ls-l查找文件以mb、kb或gb为单位打印大小,bash,unix,awk,solaris,ls,Bash,Unix,Awk,Solaris,Ls,我想使用find命令获得一个文件大小,大小以kb、mb或gb为单位,小数点仅为2 期望输出: 15.04 MB 10MB 10GB 我尝试了以下命令,但出现错误: find /orabackup/EXPDP/ATRUS001 -name "expdp_ATRUS001_04122017_0500.dmp" -exec ls -ltr {} \; | awk ' {s+=$5}' '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>10

我想使用find命令获得一个文件大小,大小以kb、mb或gb为单位,小数点仅为2

期望输出:

15.04 MB
10MB
10GB
我尝试了以下命令,但出现错误:

find /orabackup/EXPDP/ATRUS001 -name "expdp_ATRUS001_04122017_0500.dmp" -exec ls -ltr  {} \;  | awk ' {s+=$5}' '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }'
输出:

awk: cmd. line:1: fatal: cannot open file `{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }' for reading (No such file or directory
即使该文件存在于目录中,也会出现上述错误。谢谢你的帮助

awk ' {s+=$5}' '{ split( "B... ?
为什么要将
awk
程序拆分为两个参数?这几乎可以肯定是造成你的问题的原因

它将第一个参数视为
awk
程序,将第二个参数视为输入文件。错误消息支持这一点,说明“无法打开文件”“{split…”。您需要做的是将
awk
程序作为单个参数提供


顺便说一句(尽管我对Solaris不太清楚),许多GNU实用程序都使用了
-h
选项来生成人类可读的大小。您是否尝试过
ls-h

根据,Solaris支持这一点,尽管它可能不会提供您想要的两位小数


另一方面,如果您对单个大小感兴趣,我无法理解为什么您要为每行添加文件大小到
s
。我也无法理解为什么您在分区中使用
$1
,而这将是
ls
输出的
drwxr-xr-x
部分

也许你最好更详细地说明你想要实现什么

目前我能做的最好的事情就是提供以下示例:

pax> find . -name '[a-z]*' -exec ls -ltr {} ';' | awk 'BEGIN{split("B KB MB GB TB PB EB ZB YB",v)} {s=1;while($5>1024&&s<9){$5/=1024;s++}printf "%6.2f %-2s %s\n",$5,v[s],$9}'
154.00 B  ./etc_ntp.conf
150.00 B  ./input.txt
  1.85 KB ./qq.sh
200.00 B  ./tmp00
为什么要将
awk
程序分成两个参数?这几乎肯定是导致问题的原因

它将第一个参数视为
awk
程序,第二个参数视为输入文件。错误消息支持这一点,说明“无法打开文件”“{split…”。您需要做的是将
awk
程序作为单个参数提供


顺便说一句(尽管我对Solaris不太清楚),许多GNU实用程序都使用了
-h
选项来生成人类可读的大小。您是否尝试过
ls-h

根据,Solaris支持这一点,尽管它可能不会提供您想要的两位小数


另一方面,如果您对单个大小感兴趣,我无法理解为什么您要为每行添加文件大小到
s
。我也无法理解为什么您在分区中使用
$1
,而这将是
ls
输出的
drwxr-xr-x
部分

也许你最好更详细地说明你想要实现什么

目前我能做的最好的事情就是提供以下示例:

pax> find . -name '[a-z]*' -exec ls -ltr {} ';' | awk 'BEGIN{split("B KB MB GB TB PB EB ZB YB",v)} {s=1;while($5>1024&&s<9){$5/=1024;s++}printf "%6.2f %-2s %s\n",$5,v[s],$9}'
154.00 B  ./etc_ntp.conf
150.00 B  ./input.txt
  1.85 KB ./qq.sh
200.00 B  ./tmp00

短而优化的
查找
+
numfmt
解决方案:

find /your_dirpath -type f -name "filepath" -printf "%s\n" | numfmt --to=iec --format='%.2fB'
  • -printf“%s\n”
    -打印文件大小
  • numfmt…
    -将数字从可读字符串转换为可读字符串

示例输出:

3.70MB
24.27MB
38.16MB
1.76MB

短而优化的
查找
+
numfmt
解决方案:

find /your_dirpath -type f -name "filepath" -printf "%s\n" | numfmt --to=iec --format='%.2fB'
  • -printf“%s\n”
    -打印文件大小
  • numfmt…
    -将数字从可读字符串转换为可读字符串

示例输出:

3.70MB
24.27MB
38.16MB
1.76MB

@Abhinav:如果您想在
awk
中执行多个操作,请使用
将它们分开,而不是尝试使用另一个参数来执行。但是,请参阅我的更新,进一步的帮助将需要您提供有关您实际执行操作的更多详细信息。我正在尝试查找一个文件,如果发现该文件的大小超过了以kb、mb或gb为单位的大小根据文件size@Abhinav:那么您可能不想在
s
中添加任何内容,只需直接使用
$5
即可。我提供了一个示例,可以帮助您解决这个问题。它可以使用BACKUP_SIZE=
find$EXPDP_DIR_PATH-name“${BKP_TYPE}{ORACLE_SID}{BKP_ST_TIME}*.dmp”-exec ls-ltr{}124awk'BEGIN split(“B KB MB GB TB PB EB ZB YB”,v){s=1;而($5>1024&&s@Abhinav:如果您想在
awk
中执行多个操作,请使用
将它们分开,而不要尝试使用另一个参数来执行。但是,请参阅我的更新,进一步的帮助将需要您提供有关您实际执行操作的更多详细信息。如果找到一个文件,我将尝试查找该文件的大小(kb,m)b或gb(根据文件)size@Abhinav:那么您可能不想在
s
中添加任何内容,只需直接使用
$5
即可。我提供了一个示例,可以帮助您解决这个问题。它可以使用BACKUP_SIZE=
find$EXPDP_DIR_PATH-name“${BKP_TYPE}{ORACLE_SID}{BKP_ST_TIME}*.dmp”-exec ls-ltr{}124awk'BEGIN split(”B KB MB GB TB PB EB ZB YB”,v)}{s=1;虽然($5>1024&&sno不需要这种“长”处理,但一切都简单得多不需要这种“长”处理,一切都简单得多