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
命令可以通过一行完成您所需的操作
您可以查看find
的printf
操作
有关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
的方法。