Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Shell脚本递归循环遍历目录并打印重要文件的位置_Linux_Bash_Shell - Fatal编程技术网

Linux Shell脚本递归循环遍历目录并打印重要文件的位置

Linux Shell脚本递归循环遍历目录并打印重要文件的位置,linux,bash,shell,Linux,Bash,Shell,因此,我试图编写一个命令行shell脚本或shell脚本,它能够递归地循环遍历某个目录、其所有文件以及某些文件的子目录,然后将这些文件的位置打印到文本文件中 我知道这可以通过BASH命令实现,例如find、locate、exec和。 这就是我目前所拥有的查找-名称'*.class'-exec locate{}>location.txt\ 但这并不奏效。任何BASH、Shell脚本专家都能帮我吗 谢谢你阅读这篇文章 查找的默认行为(如果未指定任何其他操作)是打印文件名。因此,您可以简单地执行以下操

因此,我试图编写一个命令行shell脚本或shell脚本,它能够递归地循环遍历某个目录、其所有文件以及某些文件的子目录,然后将这些文件的位置打印到文本文件中

我知道这可以通过BASH命令实现,例如
find
locate
exec
。 这就是我目前所拥有的<代码>查找-名称'*.class'-exec locate{}>location.txt\

但这并不奏效。任何BASH、Shell脚本专家都能帮我吗


谢谢你阅读这篇文章

查找的默认行为(如果未指定任何其他操作)是打印文件名。因此,您可以简单地执行以下操作:

find <top-directory> -name '*.class' > location.txt
find-name'*.class>location.txt
或者,如果您想明确说明这一点:

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

您可以使用
find
-fprint
选项保存重定向:

find <top-directory>  -name '*.class' -fprint location.txt
find-name'*.class'-fprint location.txt
从页面:

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

一种不太可取的方法是使用
ls
: 让我们把它分解一下:

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)
更好的方法是: 在阅读了来自的建议后,同时使用
ls
find
(文章还说:“
find
在这个上下文中和ls一样糟糕”)似乎是个坏主意。这是个坏主意的原因是因为您无法控制
ls
的输出:例如,您不能将
ls
配置为使用NUL终止文件名。它有问题的原因是unix允许在文件名中使用各种奇怪的字符(换行符、管道等),并且会以您无法预料的方式“中断”
ls

最好使用shell脚本完成任务,这也是一项非常简单的任务:

创建一个文件
my_script.sh
,编辑该文件以包含:

for i in **/*; do
    echo $PWD/$i
done
给它执行权限(通过运行:
chmod+x my_script.sh

从同一目录运行它,方法如下:

./my_script.sh

你可以走了

您想获得找到的每个文件的绝对路径吗?是的,那太棒了,因为这样我就可以确切地知道它在哪里了它会在所有文件和子目录中循环查找任何.class文件,还是在找到第一个文件时停止?谢谢你的快速回答。顺便说一句:DIt给出了OP所看到的相对路径,而不是绝对路径for@user3808269它将列出所有子目录中的所有匹配文件。如果使用绝对路径运行find命令,它将打印绝对路径。如果你以相对路径开始,它会打印相对路径……好吧,如果你想要一个绝对路径,就让它
找到“$PWD/dir”
。哇哦。这很有效。感谢pdw和@CharlesDuffy的帮助,这是一个GNU扩展——在只符合POSIX标准的
find
实现中不可用:我投票给了Akos,因为这个用户的分数要少得多,而且脚本部分的语法更清晰。此外,在此之前我不知道-fprint选项。特别是@pdw,谢谢你的身体:我喜欢
fprint
节省时间而不必创建文件的方式。使用
cat
touch
@user3808269,您不需要使用
cat
touch
(特别是不使用
cat
,这实际上根本不创建文件)
>location.txt
按原样创建文件。在这个脚本中-1做什么?指定要搜索的目录在哪里?谢谢你的回复。有趣。@user3808269捕捉得好,我在玩它,忘了删除
-1
。我将在回答中为其余部分添加解释;阅读详细说明,了解为什么不应以编程方式使用
ls
。@charlesduff感谢链接-我会在孩子们上床睡觉后立即阅读。@charlesduff感谢链接!我更新了我的答案,你介意看一看并给出你的评论吗?我不是一个很好的shell脚本作者,我会很感激你的想法。
./my_script.sh