如何循环浏览目录中的文件

介绍

并非所有命令行实用程序都允许您对多个文件执行命令,但凭借壳脚本和循环的力量,您可以超载您选择的任何命令。

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

在本教程中,您将重复文件并使用Bash或zsh壳应用命令。

步骤 1 - 通过文件

在本教程中,您将使用for shell 脚本循环. 此特定控制流程方法被烤到 Bash 或 zsh 命令行壳中。

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

首先,创建目录:

1mkdir looping

然后切换到新目录:

1cd looping

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

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

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

1touch file-{1..5}.txt

要循环通过目录,然后打印文件的名称,执行以下命令:

1for FILE in *; do echo $FILE; done

您将看到以下输出:

1[secondary_label Output]
2file-1.txt
3file-2.txt
4file-3.txt
5file-4.txt
6file-5.txt

你可能注意到我们正在使用野生卡片字符, *,在那里. 这告诉‘for’循环来抓住目录中的每个单个文件. 你可以更改野生卡片可以‘file-’来瞄准所有开始于‘file-’的文件,或者‘.txt’来抓住只有文本文件。

现在你知道如何通过目录中的文件循环并吐出名称,让我们用命令使用这些文件。

步骤2 - 应用一个命令

您在上一节中创建的文件都是用触摸命令创建的,并且是空的,所以展示如何捕捉每个文件将不太有用。

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

执行以下命令,将文件的名称,然后是新行,然后是文本 Loops Rule! 插入每个文件:

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

Echo上的e旗帜确保了新闻通讯的保存。

呼喊点需要用回击来逃避,以便壳不会将字符解释为壳命令。

现在通过每个文件迭代并打印其内容:

1for FILE in *; do cat $FILE; done

现在每个文件都包含第一行文件的名称,以及第二行环节的普遍真相。

 1[secondary_label Output]
 2file-1.txt
 3Loops Rule!
 4file-2.txt
 5Loops Rule!
 6file-3.txt
 7Loops Rule!
 8file-4.txt
 9Loops Rule!
10file-5.txt
11Loops Rule!

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

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

您将看到以下输出:

 1[secondary_label Output]
 2file-1.txt
 3Loops Rule!
 4file-2.txt
 5Loops Rule!
 6file-3.txt
 7Loops Rule!
 8file-4.txt
 9Loops Rule!
10file-5.txt
11Loops Rule!

通过使用半列 ; 将命令分开,您可以连接任何您需要的命令。

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

步骤三:备份文件

现在你知道for循环是如何工作的,让我们尝试一些更真实的世界,通过收集文件目录并创建备份,这些备份是用.bak扩展添加的。

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

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

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

1ls -l

您将看到以下输出:

 1[secondary_label Output]
 2total 40K
 3-rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-1.txt
 4-rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-1.txt.bak
 5-rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-2.txt
 6-rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-2.txt.bak
 7-rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-3.txt
 8-rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-3.txt.bak
 9-rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-4.txt
10-rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-4.txt.bak
11-rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-5.txt
12-rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-5.txt.bak

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

您也不限于在相同的目录中创建副本;您可以为您的备份文件指定新的路径. 以下命令将备份存储在文件夹 /tmp/my-backups 中,只要目录已经存在:

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

备份在新位置创建。

结论

在本教程中,你实验了你的壳中的for循环,并使用它来重复文件并应用命令。

Published At
Categories with 技术
comments powered by Disqus