如何遍历目录中的文件

来自菜鸟教程
跳转至:导航、​搜索

介绍

并非所有命令行实用程序都允许您对多个文件运行命令,但借助 shell 脚本和 for 循环的强大功能,您可以对您选择的任何命令进行超级充电。

循环是您在编程中可以做的最强大的事情之一。 它允许您以最少的代码反复将相同的逻辑应用于一组项目。

在本教程中,您将使用 Bash 或 zsh shell 遍历文件并应用命令。

启动交互式终端!

第 1 步 — 循环文件

您将在本教程中使用 for shell 脚本循环。 这种特殊的控制流方法被嵌入到 Bash 或 zsh 命令行 shell 中。

您可以将以下命令应用于您选择的任何目录,但对于本教程,请创建一个目录和一些文件以供使用。

首先,创建目录:

mkdir looping

然后切换到新目录:

cd looping

现在使用 touch 命令创建几个文本文件:

touch file-1.txt
touch file-2.txt
touch file-3.txt
touch file-4.txt
touch file-5.txt

您还可以使用大括号扩展和范围快速创建这些文件:

touch file-{1..5}.txt

要遍历目录,然后打印文件名,请执行以下命令:

for FILE in *; do echo $FILE; done

您将看到以下输出:

Outputfile-1.txt
file-2.txt
file-3.txt
file-4.txt
file-5.txt

您可能注意到我们在其中使用了通配符 *。 这告诉 for 循环抓取目录中的每个文件。 您可以将通配符更改为 file-* 以针对所有以 file- 开头的文件,或更改为 *.txt 以仅获取文本文件。

现在您已经知道如何遍历目录中的文件并找出名称,让我们通过命令来使用这些文件。

第 2 步 — 应用命令

您在上一节中创建的文件都是使用 touch 命令创建的并且是空的,因此显示如何 cat 每个文件不会很有用。

幸运的是,使用类似的 for 循环,您可以使用单个命令将文本插入每个文件。

执行以下命令将文件名、后跟换行符和文本 Loops Rule! 插入每个文件:

for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; done

echo 上的 -e 标志确保保留换行符。

感叹号需要用反斜杠转义,这样 shell 就不会将该字符解释为 shell 命令。

现在遍历每个文件并打印其内容:

for FILE in *; do cat $FILE; done

现在每个文件在第一行包含文件名,在第二行包含关于循环的普遍真理。

Outputfile-1.txt
Loops Rule!
file-2.txt
Loops Rule!
file-3.txt
Loops Rule!
file-4.txt
Loops Rule!
file-5.txt
Loops Rule!

为了更进一步,您可以结合这些示例首先写入文件,然后在单个循环中显示其内容:

for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; cat $FILE; done

您将看到以下输出:

Outputfile-1.txt
Loops Rule!
file-2.txt
Loops Rule!
file-3.txt
Loops Rule!
file-4.txt
Loops Rule!
file-5.txt
Loops Rule!

通过用分号 ; 分隔命令,您可以将所需的任何命令串在一起。

现在让我们看一个实际的例子:制作文件的备份副本。

第 3 步 — 备份文件

现在您知道 for 循环是如何工作的,让我们通过获取文件目录并制作后缀为 .bak 扩展名的备份来尝试更真实的世界。

在您的 shell 中执行以下命令,为每个文件创建备份:

for FILE in *; do cp $FILE "$FILE.bak"; done;

现在使用 ls 命令显示每个文件:

ls -l

您将看到以下输出:

Outputtotal 40K
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:34 file-1.txt
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:41 file-1.txt.bak
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:34 file-2.txt
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:41 file-2.txt.bak
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:34 file-3.txt
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:41 file-3.txt.bak
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:34 file-4.txt
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:41 file-4.txt.bak
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:34 file-5.txt
-rw-r--r-- 1 sammy sammy 29 Nov  7 18:41 file-5.txt.bak

您现在拥有每个文件的精确副本,并带有一个表明它们是备份文件的扩展名。

您也不限于在同一目录中制作副本; 您可以为备份文件指定新路径。 以下命令将备份存储在文件夹 /tmp/my-backups 中,前提是该目录已存在:

for FILE in *; do cp $FILE "/tmp/my-backups/$FILE.bak"; done;

备份在新位置创建。

结论

在本教程中,您在 shell 中试验了 for 循环,并使用它来迭代文件并应用命令。