我想做的是循环目录并以非常特定的格式输出有关其子目录的信息,以便适合用户,并且也可以稍后使用awk
、grep
和等工具进行解析sed
。
这将在 bash 脚本的函数内部运行并打印到用户终端。很像一个ls
will,但具有特定的列、顺序和字段。我将在此基础上再次运行该函数,将其通过管道传递给诸如awk
仅捕获我关心的目录之类的东西,然后diff
在它们上运行其他任务。
~/Parent/2017
Directory Name Size Last Modified Number of Files
2017-08-25 1.9 GB Aug 30 16:39 141
2017-08-26 152 MB Aug 27 12:57 48
2017-08-29 5.9 GB Aug 30 7:19 462
2017-08-30 102 MB Sep 2 14:36 20
2017-08-31 2.0 GB Sep 1 9:18 148
2017-09-01 1.2 GB Sep 5 10:21 89
当我的Parent
目录看起来像这样时
> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log
到目前为止我有这样的东西
IFS=$'\n';
for d in `find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"`; do
for sd in `find ${d} -maxdepth 1 -type d`; do
file_count=`ls -lh ${sd} | wc -l`
done
ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
done
我知道它不能正常工作。我只是给出了迄今为止我所拥有的代码并且被难住了。如何file_count
为输出的每一行保存一个变量 ( ) awk
?仅供参考:我可能需要这个,这样我也可以ls
用变量替换“大小”列。du -sh directory_name
通常我可以继续解决这个问题。但我想当我达到这一点时,我想我可能会以困难的方式做到这一点,并且有一种更简单的方法可以做到这一点。你们有什么感想?这样的两个循环?或者有没有更简单的方法。
答案1
使用 GNU 工具,您可以:
find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p\0' |
gawk -F/ -v 'RS=\0' '
BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
function h(n, i) {
while (n >= 1024) {n /= 1024; i++}
return sprintf("%.4g%s", n, u[i])
}
{s[$4] += $2; n[$4]++}
NF == 4 {t[$4] = $1}
END{
PROCINFO["sorted_in"] = "@ind_str_asc"
for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
}'
即计算数量和累计明显的目录中所有文件的大小(不是磁盘使用情况),递归地(如果您不想考虑更深层次的文件,请添加一个)-maxdepth 2
。find
对于磁盘使用情况,您需要计算块计数,并且只计算一次硬链接,这会变得更加复杂。
答案2
针对脚本的某一特定部分,您熟悉 GNUfind
命令的-printf
操作吗?它可以根据您正在做的事情定制文件信息的显示。如果同时进行文件搜索和显示,您也许可以简化脚本。
为了说明该命令的灵活性:
find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'
...结果类似于...
Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--
大约有 30 种不同的指令适用于您能想到的几乎每个文件属性,并且日期格式基于它,strftime
因此它非常强大/灵活。这些标志也具有常用的修饰符,例如左/右对齐、最小数字宽度等。