Shell脚本以递归方式遍历目录并打印重要文件的位置

时间:2014-07-06 22:09:16

标签: linux bash shell

所以我正在尝试编写一个命令行shell脚本或shell脚本,它能够递归地遍历目录,所有文件和某些文件的子目录,然后将这些文件的位置打印到文本文件。

我知道使用诸如findlocateexec>之类的BASH命令是可行的。 这就是我到目前为止所拥有的。 find <top-directory> -name '*.class' -exec locate {} > location.txt \;

但这不起作用。任何BASH,Shell脚本专家能帮帮我吗?

感谢您阅读本文。

3 个答案:

答案 0 :(得分:1)

find的默认行为(如果您未指定任何其他操作)是打印文件名。所以你可以这样做:

find <top-directory> -name '*.class' > location.txt

或者如果你想明确它:

find <top-directory> -name '*.class' -print > location.txt

答案 1 :(得分:0)

您可以使用find的{​​{1}}选项保存重定向:

-fprint

来自man页面:

  

-fprint文件   [...]将完整的文件名打印到文件文件中。如果运行find时文件不存在,则创建该文件;如果确实存在,则会被截断。

答案 2 :(得分:0)

不太常用的方法是使用ls

ls -d $PWD**/* | grep class

让我们分解:

ls -d # lists the directory (returns `.`)
ls -d $PWD # lists the directory - but this time $PWD will provide full path
ls -d $PWD/** # list the directory with full-path and every file under this directory (not recursively) - an effect which is due to `/**` part
ls -d $PWD/**/* # same like previous one, only that now do it recursively to the folders below (achieved by adding the `/*` at the end)

更好的方法:

根据this的建议阅读Charles Duffy后,同时使用lsfind似乎是一个坏主意(文章也说:&#34 ; find和ls在这种情况下一样糟糕&#34;。)它之所以糟糕,是因为你无法控制ls的输出:例如,您无法配置ls以使用NUL终止文件名。它有问题的原因是unix允许在文件名(换行符,管道等)中使用所有类型的奇怪字符,并且&#34; break&#34; ls以您无法预料的方式。

最好为任务使用shell脚本,这也是非常简单的任务:

创建文件my_script.sh,编辑包含以下内容的文件:

for i in **/*; do
    echo $PWD/$i
done

授予其执行权限(通过运行:chmod +x my_script.sh)。

使用以下命令从同一目录运行它:

./my_script.sh

你很高兴去吧!