网易首页 > 网易号 > 正文 申请入驻

如何在 Linux 上遍历目录树

0
分享至

Linux 上的目录允许您将文件分组到不同的单独集合中。缺点是从一个目录移动到另一个目录来执行重复性任务变得乏味。这是自动化的方法。

所有关于目录

当您被介绍到 Linux 时,您学习的第一个命令可能是,但不会落后太多。了解目录以及如何在它们周围移动,尤其是嵌套的子目录,是了解Linux 如何组织自身以及如何将自己的工作组织到文件、目录和子目录中的基本部分。

ls

cd

掌握目录树的概念——以及如何在它们之间移动——是您在熟悉 Linux 环境时所经历的许多小里程碑之一。与路径一起使用会将您带到该目录。类似或单独的快捷方式将您带回您的主目录,并将您在目录树中向上移动一级。简单的。

cd

cd ~

cd

cd ..

但是,没有一种同样简单的方法可以在目录树的所有目录中运行命令。我们可以通过不同的方式实现该功能,但没有专门用于该目的的标准 Linux 命令。

某些命令,例如,具有强制它们以 递归方式操作的命令行选项,这意味着它们从一个目录开始,并有条不紊地遍历该目录下的整个目录树。对于,它是(递归)选项。

ls

ls

-R

如果您需要使用不支持递归的命令,则必须自己提供递归功能。这是如何做到这一点的。

树命令

该命令不会帮助我们完成手头的任务,但它确实可以很容易地查看目录树的结构。它在终端窗口中绘制树,以便我们可以及时了解构成目录树的目录和子目录,以及它们在树中的相对位置。

tree

您需要安装.

tree

在 Ubuntu 上,您需要输入:

sudo apt 安装树


在 Ubuntu 上安装树

在 Fedora 上,使用:

sudo dnf 安装树


在 Fedora 上安装树

在 Manjaro 上,命令是:

sudo pacman -Sy 树


在 Manjaro 上安装树

不带参数使用会在当前目录下绘制树。

tree

您可以在命令行上传递路径。

tree

树工作

( directories) 选项排除文件并且只显示目录。

树 -d 工作

这是获得目录树结构清晰视图的最方便的方法。此处显示的目录树是以下示例中使用的目录树。有五个文本文件和八个目录。

不要将 ls 的输出解析到遍历目录

您的第一个想法可能是,如果可以递归地遍历目录树,为什么不这样做并将输出传递到解析目录并执行某些操作的其他命令?

ls

ls

解析的输出被认为是不好的做法。由于 Linux 能够创建包含各种奇怪字符的文件和目录名称,因此创建通用的、普遍正确的解析器变得非常困难。

ls

您可能永远不会故意创建像这样荒谬的目录名称,但脚本或应用程序中的错误可能会。

解析合法但考虑不周的文件和目录名称很容易出错。我们可以使用其他方法,它们不依赖于解释.

ls

使用查找命令

该命令具有内置的递归功能,它还具有为我们运行命令的能力。这使我们能够构建强大的单线。如果它是您将来可能想要使用的东西,您可以将您的单行代码变成别名或 shell 函数。

find

该命令递归地遍历目录树,查找目录。每次找到目录时,它都会打印出目录的名称并在该目录中重复搜索。完成对一个目录的搜索后,它会退出该目录并在其父目录中继续搜索。

找工作 -type d -execdir echo "In:" {} \;

您可以通过列出目录的顺序来查看搜索在树中的进展情况。通过将命令的输出与单行程序的输出进行比较,您将看到如何依次搜索每个目录和子目录,直到找到没有子目录的目录。然后它返回一个级别并在该级别恢复搜索。

tree

find

find

以下是命令的组成方式。

  • 查找:命令。
  • find
  • work:开始搜索的目录。这可以是路径。
  • -type d:我们正在寻找目录。
  • -execdir:我们将在找到的每个目录中执行一个命令。
  • echo “In:” {}:这是命令。我们只是将目录的名称回显到终端窗口。“{}”保存当前目录的名称。
  • : 这是一个用于终止命令的分号。我们需要用反斜杠转义它,这样 Bash 就不会直接解释它。

稍作改动,我们可以让 find 命令返回匹配搜索线索的文件。我们需要包含 -name 选项和搜索线索。在此示例中,我们正在寻找与“*.txt”匹配的文本文件,并将其名称回显到终端窗口。

查找工作 -name "*.txt" -type f -execdir echo "Found:" {} \;

搜索文件还是目录取决于您要实现的目标。要在每个目录中运行命令 ,请使用. 要对每个匹配的文件运行命令 ,请使用.

-type d

-type f

此命令计算起始目录和子目录中所有文本文件中的行数。

查找工作 -name "*.txt" -type f -execdir wc -l {} \;

使用脚本遍历目录树

如果您需要遍历脚本中的目录,您可以使用脚本中的命令。如果您需要(或只是想)自己进行递归搜索,您也可以这样做。

find

#!/bin/bash
shopt -s dotglob nullglob
函数递归{
本地 current_dir dir_or_file
对于 $1 中的 current_dir;做
echo "目录命令:" $current_dir
对于 "$current_dir"/* 中的 dir_or_file;
如果 [[ -d $dir_or_file ]]; 然后
递归“$dir_or_file”
别的
wc $dir_or_file

完毕
完毕
}
递归“$ 1”

将文本复制到编辑器中并将其保存为“recurse.sh”,然后使用命令使其可执行。

chmod

chmod +x 递归.sh


使 recurse.sh 脚本可执行

该脚本设置了两个 shell 选项,并且.

dotglob

nullglob

该设置意味着扩展通配符搜索词时将返回以句点“ ”开头的文件和目录名称。这实际上意味着我们在搜索结果中包含隐藏文件和目录。

dotglob

该设置意味着未找到任何结果的搜索模式将被视为空字符串。他们不默认搜索词本身。换句话说,如果我们使用星号通配符“ ”搜索目录中的所有内容,但没有结果,我们将收到空字符串而不是包含星号的字符串。这可以防止脚本无意中尝试打开名为“*”的目录,或将“*”视为文件名。

nullglob

接下来,它定义了一个名为. 这就是有趣的事情发生的地方。

recursive

声明了两个变量,称为和。这些是局部变量,只能在函数内引用。

current_dir

dir_or_file

在函数中也使用了一个被调用的变量。这是调用函数时传递给函数的第一个(也是唯一一个)参数。

$1

该脚本使用两个循环,一个嵌套在另一个内部。第一个(外部)循环用于两件事。

for

for

一种是运行您想要在每个目录中执行的任何命令。我们在这里所做的只是将目录的名称回显到终端窗口。您当然可以使用任何命令或命令序列,或者调用另一个脚本函数。

外部 for 循环所做的第二件事是检查它可以找到的所有文件系统对象——可以是文件也可以是目录。这就是内循环的目的。反过来,每个文件或目录名称都被传递到变量中。

for

dir_or_file

然后在 if 语句中测试该变量以查看它是否是目录。

dir_or_file

  • 如果是,则函数调用自身并将目录名称作为参数传递。
  • 如果变量不是目录,那么它必须是文件。您希望应用于文件的任何命令都可以从语句的子句中调用。您还可以在同一脚本中调用另一个函数。
  • dir_or_file
  • else
  • if

脚本中的最后一行调用该函数并传入第一个 命令行 参数作为要搜索的起始目录。这就是整个过程的开始。

recursive

$1

让我们运行脚本。

./recurse.sh 工作

遍历目录,脚本中将在每个目录中运行命令的点由“Directory command for:”行指示。找到的文件会在其上运行命令来计算行数、单词和字符数。

wc

处理的第一个目录是“work”,然后是树的每个嵌套目录分支。

需要注意的一个有趣的点是,您可以通过将特定于目录的命令从内部 for 循环的上方移动到其下方来更改目录的处理顺序。

让我们将“Directory command for:”行移到内部循环的后面。

done

for

#!/bin/bash
shopt -s dotglob nullglob
函数递归{
本地 current_dir dir_or_file
对于 $1 中的 current_dir;做
对于 "$current_dir"/* 中的 dir_or_file;
如果 [[ -d $dir_or_file ]]; 然后
递归“$dir_or_file”
别的
wc $dir_or_file

完毕
echo "目录命令:" $current_dir
完毕
}
递归“$ 1”

现在我们将再次运行该脚本。

./recurse.sh 工作

这一次,这些目录首先从最深的层次应用到它们的命令,备份树的分支。最后处理作为参数传递给脚本的目录。

如果首先处理更深的目录很重要,那么您可以这样做。

递归很奇怪

这就像用自己的电话给自己打电话,给自己留言,告诉自己下次见面的时候——重复。

在您掌握它的好处之前可能需要付出一些努力,但是当您这样做时,您会发现它是一种解决难题的优雅的编程方式。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

爱文历史
2024-06-19 16:28:25
53岁陈松伶瘦到90斤,胳膊细成老公一半,与小8岁张铎至今无一子

53岁陈松伶瘦到90斤,胳膊细成老公一半,与小8岁张铎至今无一子

娱乐白名单
2024-06-19 10:47:38
NVIDIA创历史成全球市值第一!低价套现的创始人血亏超1000亿美元

NVIDIA创历史成全球市值第一!低价套现的创始人血亏超1000亿美元

快科技
2024-06-19 17:33:24
懂什么叫外交豁免权吗?不好说,但坐外交使馆牌照车里并不享有

懂什么叫外交豁免权吗?不好说,但坐外交使馆牌照车里并不享有

不掉线电波
2024-06-19 16:16:33
北大硕士愿出500w证明姜萍作假:如果输了,愿意支付她未来学费

北大硕士愿出500w证明姜萍作假:如果输了,愿意支付她未来学费

熙熙说教
2024-06-19 15:53:51
昔日“彩电大王”走向没落,被美公司欠款40亿,如今沦为三线品牌

昔日“彩电大王”走向没落,被美公司欠款40亿,如今沦为三线品牌

李哥三观很正
2024-06-14 17:51:29
乌国防采购局前负责人披露:乌私下高价采购武器,某些武器价格被哄抬5倍

乌国防采购局前负责人披露:乌私下高价采购武器,某些武器价格被哄抬5倍

参考消息
2024-06-19 08:53:51
回顾一巴掌断送退休生活,公交打人大妈摊上事了,退休金也不够赔

回顾一巴掌断送退休生活,公交打人大妈摊上事了,退休金也不够赔

玲说百态味
2024-06-18 06:18:50
尴尬,国际乒联向王曼昱发来奥运单打邀请,但女单为孙颖莎、陈梦

尴尬,国际乒联向王曼昱发来奥运单打邀请,但女单为孙颖莎、陈梦

尘语者
2024-06-19 21:45:38
姜萍这事,其实不复杂

姜萍这事,其实不复杂

民言民语
2024-06-18 11:37:36
抽进死亡之组!日本女排遭遇2大克星,网友:打完小组赛就回家吧

抽进死亡之组!日本女排遭遇2大克星,网友:打完小组赛就回家吧

体坛知识分子
2024-06-19 20:10:53
江苏部署近期暴雨和强对流天气灾害防范应对工作

江苏部署近期暴雨和强对流天气灾害防范应对工作

金台资讯
2024-06-19 21:09:09
土地未获批仍上马 四川遂宁一游乐园被拆除 800万元损失谁买单?|云求助

土地未获批仍上马 四川遂宁一游乐园被拆除 800万元损失谁买单?|云求助

封面新闻
2024-06-19 17:05:34
比亚迪要把车险价格打下来了!博主:24万元腾势N7首年保费仅6500元,同价位宝马首年保费通常超万元

比亚迪要把车险价格打下来了!博主:24万元腾势N7首年保费仅6500元,同价位宝马首年保费通常超万元

和讯网
2024-06-19 10:25:51
新型卖淫方式,让人预想不到,但却真实存在!

新型卖淫方式,让人预想不到,但却真实存在!

雪影的情感
2023-11-18 11:51:16
乘客为体验国产大飞机购票却遇空客老机型执飞,要求赔差价遭拒

乘客为体验国产大飞机购票却遇空客老机型执飞,要求赔差价遭拒

澎湃新闻
2024-06-18 20:08:29
詹俊:克罗地亚本场漏洞百出,莫德里奇没老而布罗佐维奇老了

詹俊:克罗地亚本场漏洞百出,莫德里奇没老而布罗佐维奇老了

直播吧
2024-06-19 23:25:22
不会出口欧美!拜登做梦也没想到,中国出手会这么狠

不会出口欧美!拜登做梦也没想到,中国出手会这么狠

科技龙
2024-06-12 10:23:18
上海已婚少妇“脚踏四只船”,出轨全过程曝光,传疯了!

上海已婚少妇“脚踏四只船”,出轨全过程曝光,传疯了!

拾点先生
2024-06-17 20:14:40
要大结局了?仁爱礁菲舰出现6米大裂缝,坐滩人员已中断补给25天

要大结局了?仁爱礁菲舰出现6米大裂缝,坐滩人员已中断补给25天

胖福的小木屋
2024-06-17 23:57:30
2024-06-20 03:52:49
鹰眼科技
鹰眼科技
最新科技热点都在这里!
89文章数 102280关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

房产
教育
家居
艺术
时尚

房产要闻

17.9亿!终于,有民企在三亚大手笔拿地了!周边房价10万+!

教育要闻

你好高校 | 对话北京航空航天大学

家居要闻

自然开放 实现灵动可变空间

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

几个小物件,打造宅家时的「inner peace」

无障碍浏览 进入关怀版