所以我正在尝试编写一个命令行shell脚本或shell脚本,它能够递归地遍历目录,所有文件和某些文件的子目录,然后将这些文件的位置打印到文本文件。
我知道使用诸如find
,locate
,exec
和>
之类的BASH命令是可行的。
这就是我到目前为止所拥有的。 find <top-directory> -name '*.class' -exec locate {} > location.txt \;
但这不起作用。任何BASH,Shell脚本专家能帮帮我吗?
感谢您阅读本文。
答案 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后,同时使用ls
和find
似乎是一个坏主意(文章也说:&#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
你很高兴去吧!