2015-04-26 67 views
0

我创建了vi文件,我想检查我的主目录中的文件以查看它们的大小。如果常规文件的大小大于1kb,我想将其备份为带.bak扩展名的压缩文件。我已经开始用命令du -h --max-depth=0 * | sort -r其中列出的文件,如...Bash如果文件大小大于1kb

10K archive.tar 
1.0K activity48 
1.0K activity47 
1.0K activity46 
1.0K activity45 
1.0k activity44 
1.0K activity43 
1.0K activity42 
1.0K activity41 
1.0K activity40 
1.0K activity39 
1.0K activity38 

这些都是一些中列出的文件,但我的想法是我需要削减1场,不知怎么的if语句创建和比较领域的东西像if [ $x -ge 1.0 ] ; do的东西。有关我应该如何解决问题的任何想法......?

回答

3

我会使用find

find . -maxdepth 1 -type f -size +1k -exec gzip -k -S .bak '{}' \; 

我可能会不使用自定义扩展为压缩文件,虽然,这只是要求未来的困惑。

find为通过过滤器的文件搜索目录(在这种情况下为.)。可以构建复杂的过滤器;在这个相对简单的情况下,几个原始的过滤器链接到选择

  • 文件,这些文件不超过一个层次深成.(即子目录不搜索),
  • 是普通文件,
  • 1KB或更大,并且
  • 其中gzip -k S .bak filename以状态码0退出。因为它被认为是一个动作(其他的行动包括-delete-print

-exec过滤器是特殊的。如果过滤器不包含动作,则将隐式-print动作附加到过滤器,以便打印适合过滤器的所有文件的名称。由于我们的过滤器包含一个动作,所以不会发生。

无论如何,在这种情况下,我们并不真正对-exec过滤器的结果感兴趣,只是在运行指定命令的副作用中。知道-exec也是一个过滤器是有用的,但是,如果你想链接命令。例如,如果你想它们包装后,将备份文件复制到另一个文件夹,你可以写

find . -maxdepth 1 -type f -size +1k -exec gzip -k -S .bak '{}' \; -exec cp '{}.bak' /some/where/else/ \; 

然后cp filename.bak /some/where/else/只会如果gzip -k -S .bak filename返回与0退出状态(即,如果指示的执行成功完成)。

3
find . -maxdepth 1 -type f -size +1k -exec gzip {} \; 

应该这样做。那么它会产生压缩的.gz文件。

相关问题