如何遍历目录中的文件
介绍
并非所有命令行实用程序都允许您对多个文件运行命令,但借助 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
循环,并使用它来迭代文件并应用命令。