2011-09-28 150 views
1

我需要遍历一个目录,以便从一个目录开始,并深入到不同的子目录中。不过,我也需要能够访问每个单独的文件来修改文件。是否已有命令执行此操作,还是必须编写脚本?有人可以提供一些代码来帮助我完成这项任务吗?谢谢。Unix:遍历一个目录

+0

什么是遍历的目的是什么? – Orbling

回答

1

您通常会使用find命令。在Linux上,当然你有GNU版本。它有很多额外的(和有用的)选项。两者都将允许您在找到文件时执行命令(例如shell脚本)。

如何对文件进行更改的具体细节取决于您要对文件所做的更改。这可能是最好的剧本,与find运行脚本:

POSIX或GNU:

find . -type f -exec your_script '{}' + 

这将再次运行脚本,针对一组作为参数提供的名称的文件。如果要一次执行一个文件,请将+替换为​​3210(或\;)。

5

find命令只是它的工具。它的-exec标志或-print0与xargs -0的组合允许对每个文件做什么的细粒度控制。

示例:在/ tmp和子目录中的所有文件中,用条的全部foo替换。

find /tmp -type f -exec sed -i -e 's/foo/bar/' '{}' ';' 
+0

你能提供一个代码示例吗?谢谢! –

+0

有关其他详细信息,请参见[本页](http://ss64.com/bash) –

+0

@thiton使用'sed'您不会以交互方式访问这些文件。我不认为这是@EricAnderson正在寻找的东西。 – ztank1013

2
for i in `find` ; do 
    if [ -d $i ] ; then do something with a directory ; fi 
    if [ -f $i ] ; then do something with a file etc. ; fi 
done 

这会在当前目录返回整个树(递归)的列表,循环会经过。

+3

不错的例子,但如果在文件名或目录名称中有特殊字符(如空格)则不安全。 – bot403

+0

+1同意。还有更多的东西(错误处理)。我试图说明find的行为。 – long404

2

这可以很容易地通过混合find,xargs,sed(或其他文件修改命令)来实现。

例如: $ find /path/to/base/dir -type f -name '*.properties' | xargs sed -ie '/^#/d'

这将过滤所有的文件与文件扩展名.propertiesxargs命令会将find命令生成的file path送入sed命令。 sed命令将删除文件中的所有以#开头的行(由xargs供稿)。

这种方式的命令组合非常灵活。

例如,find命令具有不同的参数,因此您可以按用户名,文件大小,文件路径(例如:在/ test /子文件夹下),文件修改时间进行过滤。

灵活性的另一个方面是如何以及如何更改文件。例如,sed命令允许您在应用替换时对文件进行更改(通过正则表达式指定)。同样,您可以使用gzip来压缩文件。等等...

0

我假设SearchMe是您需要完整遍历的示例目录名称。
我也假设,因为它没有指定,你想修改的文件都是文本文件。它是否正确?

在这种情况下,我建议使用下面的命令:

find SearchMe -type f -exec vi {} \; 

如果你不熟悉vi编辑器,只需使用另一个(nanoemacskatekwritegedit等),它应该也能工作。

0

击4+

shopt -s globstar 
for file in ** 
do 
    if [ -f "$file" ];then 
     # do some processing to your file here 
     # where the find command can't do conveniently   
    fi 
done