递归搜索目录而不改变目录atimes

时间:2017-11-10 11:55:36

标签: bash shell

我正在检查shell脚本中'find'命令的替代方法,以消除子目录的访问日期的差异。

根据我的观察,当执行find命令列出目录中的所有文件时,子目录的访问日期会发生变化。

我想在其中一个垃圾平台上发布真正的统计数据,所以我一直在寻找一些论坛,并通过'ls'命令获得替代方案。但这并不能完全满足我的要求。

以下是@ghostdog74给出的answer

ls -R %path% | awk '/:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }'. 

但是这只找到子目录中的文件。我需要列出所有文件和子目录的文件。

例如:

bash-3.2# pwd

/Users/manojkapalavai/Desktop/SleepTimeReport

bash-3.2# ls

**6th floor**   manoj17     manoj26.txt manoj36     manoj45.txt manoj55             manoj70.txt manoj80     manoj9.txt  **test1**
manoj14     manoj23.txt manoj33     manoj42.txt manoj52     manoj61.txt manoj71     manoj80.txt manoj90     **test2**. 

突出显示的是“SleepTimeReport”目录中的子目录,其余只是文件。所以,当我执行上面的命令时,我只得到以下输出。

bash-3.2# ls -R ~/Desktop/SleepTimeReport | awk '/:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }'. 

~/Desktop/SleepTimeReport/6th floor/Script to increase the Sleep Time.numbers. 
~/Desktop/SleepTimeReport/6th floor/Zone1Sleep.pages. 
~/Desktop/SleepTimeReport/test1/New_folder. 
~/Desktop/SleepTimeReport/test1/manoj.txt. 
~/Desktop/SleepTimeReport/test1/sathish.txt. 
~/Desktop/SleepTimeReport/test1/vara.txt. 
~/Desktop/SleepTimeReport/test1/New_folder/Script to increase the Sleep Time.numbers. 
~/Desktop/SleepTimeReport/test1/New_folder/Zone1Sleep.pages. 

即;只列出子目录中的那些文件。

简要说明我面临的问题,请参阅下文

Manojs-MacBook-Pro:SleepTimeReport manojkapalavai$ ls -l
total 16
drwxr-xr-x   8 manojkapalavai  staff  272 Sep 14 15:07 6th floor
-rwxr-xr-x   1 manojkapalavai  staff   59 Nov 13 10:41 AltrFind.sh
-rw-r--r--   1 manojkapalavai  staff    0 Nov  2 15:15 manoj%.txt
-rw-r--r--   1 manojkapalavai  staff    0 Nov  2 18:23 manoj1

当我在使用'find'命令之前尝试查找文件夹 6楼的创建时间和访问时间时,输出以下内容。

Manojs-MacBook-Pro:SleepTimeReport manojkapalavai$ stat -f '%N, %SB, %Sa' 6th\ floor/
6th floor/, Sep 13 10:34:55 2017, **Nov 13 11:21:33 2017**

Manojs-MacBook-Pro:SleepTimeReport manojkapalavai$ find /Users/manojkapalavai/Desktop/SleepTimeReport/
/Users/manojkapalavai/Desktop/SleepTimeReport/
/Users/manojkapalavai/Desktop/SleepTimeReport//6th floor
/Users/manojkapalavai/Desktop/SleepTimeReport//6th floor/.DS_Store
/Users/manojkapalavai/Desktop/SleepTimeReport//6th floor/Script to increase the Sleep Time.numbers
/Users/manojkapalavai/Desktop/SleepTimeReport//6th floor/Zone1Sleep.pages

现在,找到目录中的所有文件后,下面是atime的输出。你可以注意到这个变化

Manojs-MacBook-Pro:SleepTimeReport manojkapalavai$ stat -f '%N, %SB, %Sa' 6th\ floor/
6th floor/, Sep 13 10:34:55 2017, **Nov 13 14:26:03 2017**

我所做的只是找到文件,当我们发现文件夹中的子文件夹的时间变为当前时间时。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

ls the wrong tool用于程序化使用。一般来说,你应该能够修复你的find用法,使其在一段时间内没有影响(事实上,在现代生产系统中,即使在文件系统级别启用了 ,人们也很少见! ),但如果你真的想避免它,请考虑bash globstar选项:

shopt -s globstar
for file in **/*; do
  echo "Doing whatever with $file"
done