shell打印所有目录名称匹配模式的修改日期

我想写一个shell程序,它将遍历所有名称与这样的模式匹配的文件夹:

sudo sh shell.sh pub 

运行时,脚本将查找名称中包含pub所有文件夹并打印其修改日期。 我希望有代码打印结果,如下图所示: 在此处输入图像描述 我有这个代码,但它没有给我我期望的结果。

 echo 'the folder '$1' was modified at '; find -type d -name 'kam*' -exec stat -c '%y %n' '{}' \; 

我必须浏览每个文件夹并输出文本echo 'the file '$1' was modified at '; 并在图像中打印日期。

我希望得到这样的结果:

 netcom@hotspot:~$ bash script.sh testRegex Pub the folder testRegex was modified on may 15 01:19 the folder Public was modified on may 19 01:19 the folder Pubos was modified on may 19 01:19 

您可以使用find本身来打印整个内容:

 for pattern do find . -type d -name "*$pattern*" -printf 'The folder %P was modified on %t\n' done 

for pattern; do ... done for pattern; do ... done对所有参数for pattern; do ... done循环,并将pattern变量依次设置为每个参数。

使用find%P%t-printf给出文件的路径和修改时间。

您可以在启用globstar选项的情况下使用bash ,如以下脚本中所示:

 #!/bin/bash shopt -s globstar for i do for k in **/"$i"*/ do stat -c "the folder %n was modified on %y" "$k" done done 

将其保存为script ,使用chmod +x script使其可执行,并根据需要调用它:

 bash /path/to/script testRegex Pub 

请注意,这将搜索例如Pub* ,如果您确实要匹配*Pub* Pub* ,请将**/"$i"*/更改为**/*"$i"*/ 。 如果要缩短时间戳,请尝试添加| sed 's/:[^:]*$//' | sed 's/:[^:]*$//'do stat行的末尾。 您还应该尝试%N而不是%n ,特别是当涉及带有空格的目录名时,此格式更可取。

如果您希望对日期格式进行更细粒度的控制,可以使用date ,请将do stat行替换为以下内容:

 do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R" 

然后,您可以使用man date解释的常用date格式序列,此处可根据您的要求打印例如May 15 01:19

最后但并非最不重要的是,要精确打印上述任何一项的输出,您可以在目录名称后面插入一个选项卡,并按如下方式使用column

 #!/bin/bash shopt -s globstar for i do for k in **/"$i"*/ do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R" done done | column -ts$'\t' 

示例运行

 $ tree . ├── 1 │  └── 1 │  └── 1 ├── 1something └── 2  └── 1 $ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k"; done; done' _ 1 the folder 1/ was modified on 2018-06-07 09:45:28.098693507 +0200 the folder 1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200 the folder 1/1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200 the folder 1something/ was modified on 2018-06-07 09:55:36.066531665 +0200 the folder 2/1/ was modified on 2018-06-07 09:45:28.098693507 +0200 $ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k" | sed 's/:[^:]*$//'; done; done' _ 1 the folder 1/ was modified on 2018-06-07 09:45 the folder 1/1/ was modified on 2018-06-07 09:45 the folder 1/1/1/ was modified on 2018-06-07 09:45 the folder 1something/ was modified on 2018-06-07 09:55 the folder 2/1/ was modified on 2018-06-07 09:45 $ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R"; done; done' _ 1 the folder 1/ was modified on Jun 07 09:45 the folder 1/1/ was modified on Jun 07 09:45 the folder 1/1/1/ was modified on Jun 07 09:45 the folder 1something/ was modified on Jun 07 09:55 the folder 2/1/ was modified on Jun 07 09:45 $ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R"; done; done | column -ts'"$'\t'" _ 1 the folder 1/ was modified on Jun 07 09:45 the folder 1/1/ was modified on Jun 07 09:45 the folder 1/1/1/ was modified on Jun 07 09:45 the folder 1something/ was modified on Jun 07 09:55 the folder 2/1/ was modified on Jun 07 09:45 

find命令可以通过一行完成您所需的操作

您可以查看findprintf操作
有关printf的参数详细信息,请参阅man find

 find /PATH/TO/SCAN -type d -iname '*pub*' -printf "%p %TY-%Tm-%Td %TH:%TM\n" -type d : search for folders -iname '*pub*' : find the pattern case insensitive %p : display path of found folder %TY : time Year %Tm : time month %Td : time day %TH : time hour %TM : time minutes %TS : time seconds 

欲获得更多信息
GNU查找的官方网页
25 find命令的实际例子

这是一个轻微的变化,它使用-regex而不是-names

 find . -type d -regex ".*\($1\).*$" -printf 'The folder %P was modified on %Tb %Td %TH:%TM\n' 

这可以是单行脚本,也可以是更好的function。 称它为:

 ./finder.sh 'Vid\|Doc' 

这使得更加惯用, grep的方法。