介绍
并非所有命令行实用程序都允许您对多个文件执行命令,但凭借壳脚本和为
循环的力量,您可以超载您选择的任何命令。
循环是你在编程中可以做的最强大的事情之一,它允许你用最少的代码将相同的逻辑反复应用于一组项目。
在本教程中,您将重复文件并使用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
循环,并使用它来重复文件并应用命令。