在 Linux 中使用 for 循环迭代文件

2023-10-20

在 Linux 中循环文件是一项方便的技能。它可以帮助您更轻松地管理和组织文件。在本教程中,我们将学习如何使用 Bash 循环文件。

我们将看看如何使用for loop迭代常规文件、名称中带有空格的文件、目录、忽略大小写等等。

在本教程结束时,您将学习如何循环不同类型的文件和模式。

 

 

for file in /path/to/files/* 模式

Command:


for file in /path/to/files/*; do
    echo "$file"
done
  

Output:


/path/to/files/file1.txt
/path/to/files/file2.jpg
/path/to/files/file3.doc
...
  

该脚本使用 shell 通配机制。

The /path/to/files/*模式匹配目录中的每个文件/path/to/files/.

对于目录中的每个文件,回显命令打印控制台的完整路径。

循环继续,直到处理完所有文件。结果是指定目录中每个文件的列表。

 

循环常规文件

Bash 中有各种通配符可以帮助您定位特定的文件类型或模式。让我们探讨一些最常用的。

使用 (*)

Command:


for file in /path/to/files/*.txt; do
    echo "$file"
done
  

Output:


/path/to/files/file1.txt
/path/to/files/file2.txt
...
  

The *字符匹配任何字符串,允许您根据特定扩展名或命名约定过滤文件。

使用 (?)

Command:


for file in /path/to/files/file?.txt; do
    echo "$file"
done
  

Output:


/path/to/files/file1.txt
/path/to/files/file2.txt
...
  

The ?字符匹配任何单个字符,提供了一种定位具有特定命名结构的文件的方法。

使用 ([])

Command:


for file in /path/to/files/file[1-3].txt; do
    echo "$file"
done
  

Output:


/path/to/files/file1.txt
/path/to/files/file2.txt
/path/to/files/file3.txt
  

通过使用[],您可以匹配特定字符或一系列字符,从而使文件定位更加精确。

 

带 for 的 find 命令(递归循环)

Linux查找命令允许您根据各种条件搜索文件或目录。

通过结合findfor循环,您可以有效地迭代嵌套目录中的文件。
命令:


for file in $(find /path/to/files/ -type f); do
    echo "$file"
done
  

Output:


/path/to/files/subdir/file4.txt
/path/to/files/file1.txt
/path/to/files/file3.doc
...
  

The find命令用于检索所有常规文件(-type f) 之内/path/to/files/.

结果来自find然后由for环形。这echo命令将每个文件的完整路径打印到控制台。

循环继续,直到找到所有文件find被处理。

 

 

处理带有特殊字符的文件名

在 Bash 中循环文件时,特殊字符(尤其是空格)可能会造成问题。让我们来应对这一挑战。
命令:


IFS=$'\n'
for file in $(find /path/to/files/ -type f); do
    echo "$file"
done
  

Output:


/path/to/files/My Document.txt
/path/to/files/Program #123.log
...
  

通过将内部字段分隔符 (IFS) 设置为换行符。

我们指示 shell 仅将换行符视为分隔符,忽略空格。

这可确保带空格的文件名不会拆分为多个条目。

结果,for循环可以迭代带有空格或其他特殊字符的文件名,没有任何问题。

 

循环目录

有时,您需要循环目录而不是文件。具体做法如下:
命令:


for dir in /path/to/files/*/; do
    echo "$dir"
done
  

Output:


/path/to/files/directory1/
/path/to/files/directory2/
...
  

尾随的/之后*通配符确保您只匹配目录。

每个匹配目录的路径都会打印到控制台。循环继续,直到处理完指定位置的所有目录。

 

循环符号链接

符号链接(或符号链接)本质上是对其他文件或目录的引用。
命令:


for link in $(find /path/to/files/ -type l); do
    echo "$link"
done
  

Output:


/path/to/files/link_to_file1.txt
/path/to/files/link_to_directory2/
...
  

我们使用find命令与-type l仅针对符号链接的选项。

结果来自find均由for环形。每个符号链接的路径都会打印到控制台。

 

混合文件类型

您可以循环遍历常规文件、目录和符号链接的混合。让我们看看如何做到这一点。
命令:


for item in /path/to/files/*; do
    if [[ -f "$item" ]]; then
        echo "File: $item"
    elif [[ -d "$item" ]]; then
        echo "Directory: $item"
    elif [[ -L "$item" ]]; then
        echo "Symlink: $item"
    fi
done
  

Output:


File: /path/to/files/file1.txt
Directory: /path/to/files/directory1/
Symlink: /path/to/files/link_to_file1.txt
...
  

该循环迭代目录中的所有项目。条件句 (if, elif) 用于确定每个项目的类型。

根据项目的分类打印项目的类型和路径。

 

循环特定文件扩展名

有时,您需要循环遍历具有特定扩展名的文件。处理某些类型的数据或文件格式时通常会出现这种情况。
命令:


for file in /path/to/files/*.{txt,jpg,png}; do
    echo "$file"
done
  

Output:


/path/to/files/file1.txt
/path/to/files/image1.jpg
/path/to/files/picture1.png
...
  

大括号{}允许您一次匹配多个文件扩展名。

每个文件都匹配扩展名.txt, .jpg, and .png打印到控制台。

循环继续进行,直到处理完所有匹配的文件。

 

区分大小写和匹配

默认情况下,Bash 区分大小写。但是,在某些情况下,您希望循环遍历文件,无论其大小写如何。
命令:


shopt -s nocaseglob
for file in /path/to/files/*.[Tt][Xx][Tt]; do
    echo "$file"
done
shopt -u nocaseglob
  

Output:


/path/to/files/file1.TXT
/path/to/files/file2.txt
...
  

The shopt -s nocaseglob命令用于关闭通配符的区分大小写。

图案*.[Tt][Xx][Tt]匹配小写和大写变体.txt files.

每个匹配文件的路径都会打印到控制台。最后,使用返回默认的区分大小写shopt -u nocaseglob.

 

忽略隐藏文件

如果您想处理文件同时排除隐藏文件。以下是如何实现这一目标:
命令:


for file in /path/to/files/*; do
    if [[ ! $file =~ ^..* ]]; then
        echo "$file"
    fi
done
  

Output:


/path/to/files/file1.txt
/path/to/files/image1.jpg
...
  

该循环迭代目录中的所有项目。这if语句检查文件名是否不以点开头(.).

如果文件未隐藏,其路径将打印到控制台。

 

使用正则表达式

Bash 支持正则表达式,为高级模式匹配提供了强大的手段。
命令:


for file in /path/to/files/*; do
    if [[ $file =~ ^/path/to/files/file[0-9]+.txt$ ]]; then
        echo "$file"
    fi
done
  

Output:


/path/to/files/file1.txt
/path/to/files/file23.txt
...
  

循环遍历中的每个项目/path/to/files/.

The if语句检查文件是否与正则表达式模式匹配^/path/to/files/file[0-9]+\.txt$.

文件名为file后跟一位或多位数字并以.txt匹配这个模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux 中使用 for 循环迭代文件 的相关文章

  • 安装Python时出错

    击中后 make install 我收到以下错误 usr bin install cannot create regular file usr local bin python2 6 Permission denied make altbi
  • 使用 libjpeg 编写 jpeg(段错误)

    尝试使用 libjpeg 从一些原始数据写入 jpeg 文件 它会触发分段错误jpeg start compress 这是代码的相关部分 void write sub image char filename int start int en
  • 如何在特定时间后从“std::cin”读取超时

    我写了一个小程序 int main int argc char argv int n std cout lt lt Before reading from cin lt lt std endl Below reading from cin
  • 为什么我的 git 自动更新 Expect 脚本不起作用?

    我想制作一个脚本来更新我所有的 GitHub 存储库 我只需要输入我的用户名和密码 脚本将遍历存储库列表 调用git push并通过补充 Expect 脚本提供必要的信息 这是我的 bash 脚本 bin bash echo Updatin
  • Ruby 脚本即服务

    嗯 标题说明了一切 我有一个 ruby 脚本 我想在我的 Linux 机器上作为一项服务 我可以启动和停止 运行 我找到了如何在 Windows 上执行此操作here https stackoverflow com questions 16
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • 使用 M1 在 dockerized Linux 上安装节点画布

    我有以下Dockerfile我在 MacBook Air M1 上运行 所以在 docker 中我有带有 M1 的 linux FROM node 16 7 0 WORKDIR work CMD while true do sleep 10
  • Gnu 时间和格式化输出

    我想使用 gnu time 来测量一些小 c 程序的运行时间 人 中写道 f FORMAT format FORMAT Use FORMAT as the format string that controls the output of
  • 如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

    当您写入稀疏文件时 ext2 ext3 文件系统会自动分配块 但是当我不再需要其中的某些块时 我发现没有办法做到这一点 感觉就像使用 malloc 而不使用 free 是否可以 释放 稀疏文件的某些块 如果是的话 怎么样 不要告诉我将其复制
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma
  • VS Code 不会构建具有多个 .cpp 源文件的 C++ 程序

    请注意 我在 Ubuntu 17 10 上使用 VS Code 并使用 GCC 编译器 我在构建一个使用附加 cpp 文件的简单程序时遇到问题 我可能在这里遗漏了一些明显的东西 因为我对编程相当陌生 但我会解释到目前为止我所做的事情 这阻止
  • 在 Alpine Docker 容器上安装 OpenSSH

    第一次运行 alpine docker 容器并尝试 openssh 安装时 会发生以下情况 ole T docker run it rm alpine bin ash apk add openssh WARNING Ignoring APK
  • 如何检查程序是否在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?

    非常简单 确定您所使用的操作系统的通常位置似乎与 Ubuntu for Windows 上的普通 Ubuntu 相同 例如uname a与本机 GNU Linux 安装相同并且 etc os version与 Ubuntu Trusty T
  • 在内核模块中执行shell命令

    是否可以在内核模块中执行shell命令 我知道我们可以在用户空间 C 代码中使用system子程序 我正在调试一个存在内存泄漏问题的内核模块 在无限循环中执行 insmod 和 rmmod module ko 后 8G RAM 的系统在几分
  • 为什么当设置为 TLS 选择器时,ES 和 DS 在 64 位内核上最终会归零?

    下面的 32 位程序调用set thread area 2 http linux die net man 2 set thread area在 GDT 中创建一个条目 该条目旨在用于 TLS 通常将结果选择器放入FS or GS并成功使用
  • 如何获取Linux中进程或端口的网络带宽使用情况

    我想获取每个进程的网络带宽使用情况 我找了很多这方面的资料 比如iftop nethogs http nethogs sourceforge net Linux进程浏览器 http sourceforge net projects proc
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 检查 VT-x 是否已激活而无需在 Linux 中重新启动?

    我有一台配备 Intel Core i5 M 450 2 40GHz 的笔记本电脑 显然有 VT x 但没有 VT d 我有 Ubuntu 12 04 32 位 但希望在其上运行基于虚拟 64 位终端的 Linux 我如何知道 BIOS 是
  • 如何有效地将许多文件移动到新服务器?

    我正在更换托管提供商 需要将数百万个上传的文件传输到新服务器 所有文件都位于同一目录中 是的 你读对了 过去我这样做过 压缩源服务器中的所有文件 scp到新服务器的 zip Unzip Move directory to appropria

随机推荐

  • 如何在 Linux 中终止进程

    您是否遇到过这样的情况 您启动了一个应用程序 但在使用该应用程序时突然变得无响应并意外崩溃 您尝试再次启动应用程序 但没有任何反应 因为原始应用程序进程从未真正完全关闭 好吧 我们所有人都曾在某个时刻发生过这种事 不是吗 解决方案是终止或终
  • 如何在 CentOS 7 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 专为客户端和服务器之间的安全连接而设计 两种最流行的 SSH 身份验证机制是基于密码的身份验证和基于公钥的身份验证 使用 SSH 密钥通常比传统的密码身份验证更安全 更方便 本教程介绍如
  • 如何重命名本地和远程 Git 分支

    您正在与一群人合作开发一个项目 并且您已经为 git 分支定义了命名约定 你创建了一个新分支 将更改推送到远程存储库 并意识到您的分支名称不正确 幸运的是 Git 允许您使用以下命令轻松地重命名分支 git branch m命令 本指南介绍
  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引
  • Bash While 循环:从基础知识到实际应用

    In Bash 脚本 while 循环用于在指定条件为 true 时执行语句块 基本语法是 while CONDITION do Commands to be executed done 只要 CONDITION 计算结果为 true 循环
  • 使用 Pandas DataFrame iloc 属性进行基于索引的访问

    The iloc财产在Pandas库代表 整数位置 并提供基于整数的索引以按位置进行选择 这意味着您可以通过整数位置选择 DataFrame 中的行和列 在本教程中 我们将介绍使用的各个方面iloc 包括选择单行 多行 特定列 甚至单个单元
  • Python defaultdict 简介:类固醇词典

    在Python中 defaultdict是一个类似于字典的类collections模块允许我们为字典中未显式设置的键定义默认值 它是内置的子类dict class Both dict and defaultdict用于以键值对格式 Pyth
  • 19 个有用的 Linux 命令行提示和技巧

    您可能已经注意到 Linux 是一个非常复杂的操作系统 因此 当发生的事情太多时 工作可能会变得有点乏味 但这正是 Linux 的自然之美的闪光点 有许多技巧和快捷方式可以在命令行中使用 以提供额外的便利 这一系列的技巧包括方便的命令和巧妙
  • Python 编程基础知识与示例

    Python 是一种流行且功能强大的脚本语言 可以做任何事情 您可以执行网页抓取 网络工具 科学工具 Raspberry Pi 编程 Web 开发 视频游戏等等 通过Python编程 无论您使用什么平台 您甚至可以进行系统编程 说到机器学习
  • 退出/终止 Python 脚本(简单示例)

    今天 我们将深入探讨退出 终止 Python 脚本的主题 您可以使用您选择的 IDE 但这次我将使用 Microsoft 的 Linux Subsystem for Windows WSL 软件包 有关该功能以及如何在 Windows 10
  • 使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame

    The read sql函数允许您将数据从 SQL 数据库直接加载到Pandas数据框 它允许您直接解析和执行 SQL 查询或将整个表读入数据框 通过使用pandas read sql 您正在 SQL 数据库和 Pandas 之间建立无缝桥
  • 在 Linux 中使用 for 循环迭代文件

    在 Linux 中循环文件是一项方便的技能 它可以帮助您更轻松地管理和组织文件 在本教程中 我们将学习如何使用 Bash 循环文件 我们将看看如何使用for loop迭代常规文件 名称中带有空格的文件 目录 忽略大小写等等 在本教程结束时