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)
您可以使用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.
您可以使用启用bash的globstar选项,如以下脚本所示:
#!/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)
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |