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

Muh*_*Muh 4 command-line bash 14.04

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

sudo sh  shell.sh   pub 
Run Code Online (Sandbox Code Playgroud)

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

echo  'the folder '$1' was modified at ';
 find  -type d -name 'kam*'  -exec stat -c '%y %n' '{}' \;
Run Code Online (Sandbox Code Playgroud)

我必须遍历每个文件夹并输出文本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 
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 6

您可以使用find它自己来打印整个内容:

for pattern
do
    find . -type d -name "*$pattern*" -printf 'The folder %P was modified on %t\n'
done
Run Code Online (Sandbox Code Playgroud)

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

find,%P%t-printf.


des*_*ert 5

您可以使用启用bashglobstar选项,如以下脚本所示:

#!/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
Run Code Online (Sandbox Code Playgroud)

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

bash /path/to/script testRegex Pub
Run Code Online (Sandbox Code Playgroud)

请注意,这将搜索例如Pub*,如果您确实想要匹配*Pub*,请更改**/"$i"*/**/*"$i"*/。如果要缩短时间戳,请尝试添加| 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"
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 中date解释的常用格式序列man 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'
Run Code Online (Sandbox Code Playgroud)

示例运行

$ 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
Run Code Online (Sandbox Code Playgroud)