2020年4月

深色模式是 Ubuntu 20.04 最受瞩目的新功能之一了。任何版本的 Ubuntu 都可以通过安装深色主题让用户界面拥有一个深色的外观,但在 Ubuntu 20.04 中,这个过程变得更简单。

在 Ubuntu 20.04 中,无需额外安装主题,默认主题(称为 Yaru)本身就带有三种模式,其中就包括深色模式。

下面我会展示如何将 Ubuntu 系统完全设置为深色模式。

在 Ubuntu 20.04 打开深色模式

这个步骤是在 GNOME 桌面上进行的,如果你使用的是其它桌面,你看到的可能会和下面的截图不一样。

按下 super 键(或 Windows 键),然后输入 “settings”,就可以找到系统设置。

Search for Settings

在系统设置中,进入“ 外观 Appearance ”部分,就可以看到 浅色 light 标准 standard 深色 dark 三个选项。既然要使用深色模式,那自然而然要选择“深色”这个选项了。

Enable Dark Theme in Ubuntu

完成设置以后,使用了 GTK3 的应用程序都可以跟随深色模式。因此你会看到系统中包括文本编辑器、终端、LibreOffice 等在内的大多数应用程序都已经切换成深色了。但未使用 GTK3 的应用程序可能并没有跟随进入深色模式,下面我会展示如何更完整地进入深色模式。

继续调整,进入完整深色模式

这个时候你会发现,shell 主题、屏幕顶部面板中的消息托盘和系统托盘还仍然保持在原有的模式当中。

No Dark Shell by default in Ubuntu

现在就需要使用 GNOME 扩展安装 Yaru 深色 shell 主题了。在 Ubuntu 中通过 Ctrl+Alt+T 打开终端,然后执行以下这个命令安装浏览器扩展:

sudo apt install chrome-gnome-shell

进入扩展页面启用这个扩展:

Enable User Themes GNOME Extension

执行以下命令安装 GNOME 调整工具

sudo apt install gnome-tweaks

打开 GNOME 调整工具,进入“ 外观 Appearance ”部分,就可以看到 shell 主题的选项,现在只需要把它启用就可以了。

Enable Yaru Dark Shell Theme in Ubuntu

设置完之后再观察一下,桌面通知、消息托盘、系统托盘等等都已经进入深色模式了。

Yaru Dark Shell Theme in Ubuntu

现在感觉好多了。但你可能还会注意到,在使用浏览器访问网站的时候,很多网站都使用了白色的背景色。如果期望网站方提供深色模式,那是很不现实的,但我们可以自己实现这一件事。

你需要用到的东西就是诸如 Dark Reader 这样的浏览器扩展。《在 Firefox 中启用深色模式》这篇文章中也有讨论过这个浏览器扩展,它的使用过程并不复杂,如果你使用的浏览器是 Firefox、Chrome 或 Ubuntu 下的 Chromium,就可以直接安装其官方网站上列出的扩展。

Dark Reader 安装完成后,就会以深色模式打开网站了。

It’s FOSS Homepage in Dark Mode with Dark Reader

当然,有些外部的第三方应用程序可能仍然是浅色状态。如果它们自己附带了深色模式的选项,就需要手动启用它们的深色模式。

如今,深色模式在非开发者人群中也越来越流行了。按照以上的步骤,你就可以轻松进入深色模式。

请享受深色模式。


via: https://itsfoss.com/dark-mode-ubuntu/

作者:Abhishek Prakash 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

IEEE 标准协会宣布了一个基于 GitLab 的开源协作平台。

IEEE 是世界上最大的技术专业组织,致力于推动技术的发展。 IEEE 标准协会 the IEEE Standards Association (IEEE SA)是 IEEE 内部的一个组织,负责制定全球各行业的标准。

IEEE 标准协会(SA)提出了一个开源协作平台,即 IEEE SA Open

技术上来说,它是一个自托管的 GitLab 实例,结合了 Mattermost(一个 Slack 的替代品)和 GitLab Pages其官方博文对此进一步解释道:

该平台使独立软件开发者、初创企业、业界、学术机构等能够在一个协作、安全、负责任的环境中创建、测试、管理和部署创新项目。

它有什么不同或有用的地方?

这个平台最主要的吸引力应该是 IEEE 的会员网络、技术专长和资源。

IEEE 主席 Robert Fish,也曾(在接受 Radio Kan 的采访时)简单地提到它有什么不同之处,以及为什么 IEEE 想要使用它。

如今,世界上大部分的基础设施都是由软件运行的,而这些软件需要符合通信网络、电网、农业等方面的标准。

这是有道理的 —— 如果我们想提高标准化技术,这在很大程度上取决于软件。所以,这听起来肯定是要对创新的开源项目进行标准化,让它们也能为潜在的资本机会做好准备。

IEEE 还澄清说:

随着软件在当今世界越来越普遍,道德规范、可靠性、透明度和民主治理成为必须具备的条件。IEEE 在赋予开源项目这些属性方面有着得天独厚的优势。

虽然听起来很好,但 IEEE 的开源平台究竟能提供什么?让我们一起来看看这个问题。

IEEE SA Open 概览

首先,它对所有人开放并且完全免费使用。你只需要创建一个 IEEE 帐户,然后登录到这个开源平台就可以开始。

除了与 IEEE 广泛的会员网络相关的好处之外,你还可以期望其开源社区经理或社区成员提供指导性支持。

Ieee Gitlab

该平台提供了标准和非标准项目的用例,你可以尝试一下。

因为选择将 GitLab 与 Mattermost 和 Pages 结合起来,你可以获得一些有用的功能,它们是:

  • 项目规划和管理功能
  • 源代码管理
  • 测试、代码质量和持续集成功能
  • Docker 容器注册库和 Kubernetes 集成
  • 应用程序的发布和交付功能
  • 集成了 Mattermost 聊天论坛的斜线命令(完全支持 Android 和 iPhone 应用程序)
  • 能够弥合标准制定和开源社区之间的差距,以便以更快的速度推进灵活和创造性的技术解决方案
  • 安全的开放空间,并有严格的行为准则。

小结

显然,有更多的平台来潜在地放大开源项目的曝光率是一件好事 —— 因此,IEEE 的举措听起来很有希望。

你对此有何看法?让我知道你的想法吧!


via: https://itsfoss.com/ieee-open-source-collaboration-platform/

作者:Ankush Das 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 上,有很多种音频编辑器可供你选用。不论你是一个专业的音乐制作人,还是只想学学怎么做出超棒的音乐的爱好者,这些强大的音频编辑器都是很有用的工具。

对于专业级的使用,我总是建议使用 DAW(数码音频工作站)。但并不是每个人都需要全部的功能,所以你也应该了解一些最简单的音频编辑器。

在本文中,我们将讨论几款 DAW 和基础的音频编辑器,而且它们都是在 Linux 和(可能)其它操作系统上可以使用的自由开源的解决方案。

Linux 上的最佳音频编辑器

Best audio editors and DAW for Linux

我们不会关注 DAW 提供的所有功能,而只是关注基本的音频编辑功能。不过,你仍然可以把以下内容看作是 Linux 的最佳 DAW 名单。

安装说明:你可以在 AppCenter 或软件中心中找到所有提到的音频编辑器或 DAW。如果你在这两个地方没有找到它们,请前往它们的官方网站获取更多信息。

1、Audacity

Audacity audio editor

Audacity 是 Linux 中最基本音频编辑器之一,但是它也很强大。它是一个自由开源的跨平台工具。肯定已经有很多人了解这个软件了。

现在的它相比它最初流行的时候有了很大的改进。我记得我以前试着通过从音频中去除人声来制作卡拉 OK 伴奏。现在有些时候,你仍然可以这么做。

特性:

它还支持包含 VST 效果的插件。当然,你不应该期望它支持 VST 乐器。

  • 通过麦克风或混音器进行现场录制
  • 支持同时从多种音频格式的多个文件中批量导出/导入内容
  • 支持 LADSPA、LV2、Nyquist、VST 和 Audio Unit 的效果插件
  • 使用简单,带有剪切、粘贴、删除和拷贝的功能
  • 可观测声音频率的频谱模式

2、LMMS

LMMS audio editor

LMMS 是一个自由开源的(跨平台)数码音频工作站。它包括所有基本的音频编辑功能以及许多高级功能。

你可以混音、组合音频,或使用 VST 设备创造音频。LMMS 支持这些功能。此外,它还自带一些样本音频、预设、VST 设备和特效来帮助你起步。此外,你还可以得到一个频谱分析仪,以便进行高级的音频编辑工作。

特性:

  • 基于 MIDI 的音符回放
  • 支持 VST 设备
  • 原生支持多采样
  • 内置压缩器、限制器、延迟功能、混响功能、失真功能和低音增强器

3、Ardour

Ardour audio editor

Ardour 是另一个自由开源的数码音频工作站。只要你有音频接口,Ardour 就支持它的使用。当然,你也可以无限地添加多声道音轨。这些多声道音轨也可以被指派到不同的混音带,以方便编辑和录音。

你也可以导入一个视频,编辑其中的音频,然后导出新的视频。它提供了许多内置插件,并且支持 VST 插件。

特性:

  • 非线性编辑
  • 垂直窗口堆叠,便于导航
  • 静默消除功能 strip silence 推拉修剪功能 push-pull trimming ,和用以短暂片段或基于基于音符开始的编辑的 Rhythm Ferret。

4、Cecilia

Cecilia audio editor

Cecilia 不是一个普通的音频编辑器。它的使用者一般是音效设计师或者正在努力成为音效设计师的人。 Cecilia 实际上是一个音频信号处理环境。它可以让你的作品余音绕梁。

你还可以得到内置的音效与合成模组和插件。Cecilia 为一个明确的目的而生:如果你正在找音效设计工具,这是你的不二之选!

特性:

  • 利用模块来完成更多工作(UltimateGrainer —— 最先进的颗粒化处理工具,RandomAccumulator —— 记录变量速度的累加器,UpDistoRes——通过上采样和谐振低通滤波器创造失真效果的工具)
  • 自动保存调制设定

5、Mixxx

Mixxx audio DJ

如果你想要在混合和录制一些东西的同时能够有一个虚拟的 DJ 工具,Mixxx 将是完美的工具。你可以用到 BPM、音调,并使用主同步功能来匹配歌曲的节奏和节拍。另外,不要忘记它也是一个 Linux 的自由开源的软件。

它还支持自定义 DJ 设备。所以,如果你有 DJ 设备或者 MIDI,你可以用这个工具录制你的现场混音。

特性:

  • 播送和录制你的歌曲的 DJ 混音
  • 可以连接到你的设备并且现场演奏
  • 音调检测和 BPM 检测

6、Rosegarden

Rosegarden audio editor

Rosegarden 是另一个令人赞叹的 Linux 的自由开源的音频编辑器。它既不是一个功能齐全的 DAW,也不是一个基本的音频编辑工具。它是两者的混合体,并带有一些缩减的功能。

我不会向专业人士推荐这款软件,但如果你经营家庭音乐工作室或只是想体验一下,这将是 Linux 上可以安装的最好的音频编辑器之一。

特性:

  • 乐谱编辑
  • 录音、混音以及采样

小结

这些是你可以找到的 Linux 上的最棒的一些音频编辑器了。不论你是需要 DAW,一个剪切/粘贴的编辑工具,或者仅仅想要一个拥有基础的混音和录音功能的音频编辑工具,上述软件都能够满足你的需求。

如果在这篇文章中我们遗漏了你最喜欢的一些音频工具,可以在原文下方评论中回复告诉我们。


via: https://itsfoss.com/best-audio-editors-linux

作者:Ankush Das 选题:lujun9972 译者:MFGJT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你用过 Ubuntu 或者其他的 Linux 发行版里的自动登录功能, 你可能遇到过这种弹出消息:

请输入密码以解锁你的登录密钥环

登录密钥环在你登录系统时未解锁。

Enter Password To Unlock Your Login Keyring Ubuntu

如果你一直点击取消,它会不断弹出几次才会消失。你可能想知道,为什么你会一直看到这个密钥环信息呢?

让我来告诉你吧。它其实不是错误,而是一个安全特性。

奇怪吗?下面就让我来解释下 Linux 里的密钥环概念。

Linux 里的密钥环是什么。为什么需要它?

在现实生活中你为什么要用钥匙环(也叫钥匙链)?你用它把一把或多把钥匙串到一起, 以便于携带和查找。

Linux 里也是类似的。密钥环特性使你的系统可以将各种密码放在一起,并将其保存在一个地方。

大多数 Linux 桌面环境,如 GNOME、KDE、Xfce 等采用 GNOME 密钥环来提供这个功能。

该密钥环保存了 ssh 密钥、GPG 密钥以及使用此功能的应用程序(例如 Chromium 浏览器)的密钥。默认情况下,“密钥环”通过主密码来保护,该密码通常是帐户的登录密码。

系统上的每个用户都有自己的密钥环,(通常)密码与用户帐户本身的密码相同。当你使用密码登录系统时,你的密匙环将使用你帐户的密码自动解锁。

当你启用 Ubuntu 中的自动登录功能时时,就有问题了。这意味着你无需输入密码即可登录系统。在这种情况下,你的密钥环不会自动解锁。

密钥环是一个安全特性

记得我说过密钥环是一个安全特性吗?现在想象一下你在 Linux 电脑上开启了自动登录功能。有权访问你电脑的任何人无需密码就能进入你的系统。但是你可能不会在意,因为你只是用它来访问互联网。

但是,如果你在 Ubuntu 中使用 Chromium 或 Google Chrome 之类的浏览器,并使用它来保存各种网站的登录密码,那么你将遇到麻烦。任何人都可以使用浏览器并利用你在浏览器中保存的密码登录网站。这不很危险吗?

这就是为什么当你使用 Chrome 时,它将反复地提示你先解锁密钥环。这确保了只有知道密钥环密码(即账户密码)的人才能使用在浏览器中保存的密码来登录它们相关的网站。

如果你反复取消解锁密钥环的提示,它最终将消失,并允许你使用浏览器。但是,保存的密码将不会被解锁,你在 Chromium/Chome 浏览器上将会看到“同步暂停”的提示。

Sync paused in Google Chrome

如果密钥环一直存在,为什么你从来没有见过它呢?

如果你在你的 Linux 系统上从没见过它的话,这个问题就很有道理。

如果你从没有用过自动登录功能(或者修改你的账户密码),你可能都没有意识到这个特性的存在。

这是因为当你通过你的密码登录系统时,你的密钥环被你的账户密码自动解锁了。

Ubuntu(和其他发行版)在执行普通的管理任务如修改用户、安装新软件等需要输入密码,无论你是否是自动登录的。但是对于日常任务像使用浏览器,它不需要输入密码因为密钥环已经被解锁了。

当你切换到自动登录时,你不再需要输入登录密码。这意味着密钥环没有被自动解锁,因此当你使用利用了密钥环特性的浏览器时,它将提示你来解锁密钥环。

你可以轻松地管理密钥环和密码

这个密钥环放在哪里?它的核心是一个守护任务(一个后台自动运行的程序)。

别担心。你不必通过终端来操作守护任务。大多数桌面环境都自带一个可以和这个守护进程进行交互的图形化应用程序。KDE 上有 KDE 钱包,GNOME 和其他桌面上叫做“密码和密钥”(之前叫 Seahorse)。

Password And Keys App in Ubuntu

你可以用这个 GUI 程序来查看哪些应用程序在用密钥环来管理/保护密码。

你可以看到,我的系统有自动创建的登录密钥环。也有一个存储 GPG 和 SSH 密钥的密钥环。那个证书用来保存证书机构颁发的证书(如 HTTPS 证书)。

Password and Keys application in Ubuntu

你也可以使用这个应用程序来手动保存网站的密码。例如,我创建了一个新的叫做“Test”的被密码保护的密钥环,并手动存储了一个密码。

这比在一个文本文件中保存一批密码要好一些。至少在这种情况下,你的密码只有在你通过密码解锁了密钥环时才允许被看到。

Saving New Password Seahorse

这里有一个潜在的问题,如果你格式化你的系统,手动保存的密码必然会丢失。通常,你会备份你的个人文件,但并不是所有的用户特定数据,如密钥环文件。

有一种办法能解决它。密钥环数据通常保存在 ~/.local/share/keyrings 目录。在这里你可以看到所有的密钥环,但是你不能直接看到它们的内容。如果你移除密钥环的密码(我会在这篇文章的后面描述操作步骤),你可以像一个普通的文本文件一样读取密钥环的内容。你可以将这个解锁后的密钥环文件完整地复制下来,并在其他的 Linux 机器上运行“密码和密钥”应用程序导入到其中。

总结一下目前为止所学的内容:

  • 大多数 Linux 系统缺省已经安装并激活了密钥环特性
  • 系统上的每个用户都拥有他自己的密钥环
  • 密钥环通常是用账户密码锁定的(保护)
  • 当你通过密码登录时密钥环会被自动解锁
  • 对于自动登录,密钥环不会自动解锁,因此当你试图使用依赖密钥环的应用程序时会被提示先解锁它
  • 并不是所有的浏览器或应用程序利用了密钥环特性
  • (Linux 上)安装一个 GUI 程序可以和密钥环交互
  • 你可以用密钥环来手动存储加密格式的密码
  • 你可以自己修改密钥环密码
  • 你可以通过导出(需要先解锁密钥环)并导入到其他计算机上的方式来获取手工保存的密码。

修改密钥环密码

假设你修改了你的账户密码。当你登录时,你的系统试图通过新的登录密码来自动解锁密钥环。但是密钥环还在使用老的登录密码。

这种情况下,你可以修改密钥环密码为新的登录密码,这样密码环才能在你登录系统时自动解锁。

从菜单中打开“密码和密钥”应用程序:

Look for Password and Keys app in the menu

在“Login”密钥环上右击并点击“修改密码”:

Change Keyring Password

如果你不记得老的登录密码怎么办?

你可能知道在 Ubuntu 上重置忘记的密码很容易。但是密钥环在这种场景下还是有问题。你修改了账户密码,但是你不记得仍然被密钥环使用的老的账户密码。

你不能修改它因为你不知道老的密码。怎么办?

这种情况下,你将不得不移除整个密钥环。你可以通过“密码和密钥”应用程序来操作:

Delete Keyring Ubuntu

它会提示你进行确认:

Delete Keyring

另外,你也可以手动删除 ~/.local/share/keyrings 目录下的密钥环文件。

老的密钥环文件被移除后,你再打开 Chrome/Chromium 时,它会提示你创建一个新的密钥环。

New Keyring Password

你可以用新的登录密码,密钥环就会被自动解锁了。

禁用密钥环密码

在你想用自动登录但又不想手动解锁密钥环时,你可以把禁用密钥环密码作为一个规避方法。记住你正在禁用一个安全特性,因此请三思。

操作步骤和修改密钥环相似。打开“密码和密钥”应用程序,然后修改密钥环密码。

技巧在于当它提示修改密码时,不要输入新密码,而是点击“继续”按钮。这将移除密钥环的密码。

Disable Keyring password by not setting any password at all

这种方法,密钥环没有密码保护,并将一直处于解锁状态。


via: https://itsfoss.com/ubuntu-keyring/

作者:Abhishek Prakash 选题:lujun9972 译者:messon007 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

at 命令可以很容易地安排 Linux 任务在你选择的任何时间或日期运行,让我们来看看它能为你做什么。

当你希望命令或脚本在某个特定时间运行时,你不需要将手指放在键盘上盘旋等待按下回车键,或者是在特定时间坐在办公桌前。相反,你可以通过 at 命令来设置任务。在本文中,我们将研究如何使用 at 来安排任务,如何精确地选择任务希望运行的时间,以及如何使用 at 来查看安排运行的任务。

at vs cron

对于那些使用 cron 在 Linux 系统上安排任务的人来说,at 命令类似于 cron,因为你可以在选定的时间调度任务,但是 cron 用于定期运行的作业 —— 甚至是每年仅一次。大多数 cron 作业的频率都设置为每天、每周或每月运行一次,不过你可以控制运行的频率和时间。

另一方面,at 命令用于仅运行一次的任务。想在午夜重启系统?没问题,只要你有适当的权限,at 可以为你完成此操作。如果你希望系统在每个星期六凌晨 2 点重启,那么改用 cron。

使用 at

at 命令很容易使用,只需记住几件事。一个简单使用 at 的例子类似于这样:

$ at 5:00PM
at> date >> thisfile
at> <EOT>

在输入 at 和应该运行命令的时间,at 会提示你在设定时间会运行该命令(此例中是 date 命令)。输入 ^DCtrl + d)来完成请求。

假设我们在下午 5 点之前设置这个 at 命令,那么这个日期和时间将在当天下午 5 点添加到名为 thisfile 文件的末尾。否则,该命令将在第二天下午 5 点运行。

at 命令进行交互时,可以输入多个命令。如果你要同时运行多个命令,只需输入多个命令行即可:

$ at 6:22
warning: commands will be executed using /bin/sh
at> echo first >> thisfile
at> echo second >> thisfile
at> <EOT>

在上面的命令中,我们使用了一个普通的用户账户,将一些简单的文本添加到该用户主目录的文件中。如果在上午 6:22 之后运行这些命令,那么命令会在第二天运行,因为 6:22 表示上午 6:22。如果你想在下午 6:22 运行,使用 6:22 PM 或者 18:226:22 PM 这样也是可以工作的。

你也可以通过使用 at 来安排命令在指定的日期或时间运行,例如 10:00AM April 15 2021noon + 5 days(从今天起 5 天内的中午运行),以下是一些例子:

at 6PM tomorrow
at noon April 15 2021
at noon + 5 days
at 9:15 + 1000 days

在指定要运行的命令并按下 ^D 后,你会注意到 at 命令为每个请求分配了一个作业编号,这个数字将显示在 at 命令的作业队列中。

$ at noon + 1000 days
warning: commands will be executed using /bin/sh
at> date >> thisfile
at> <EOT>
job 36 at Tue Dec 27 12:00:00 2022        <== job # is 36

检查队列

你可以使用 atq(at queue)命令来查看 at 作业队列:

$ atq
32      Thu Apr  2 03:06:00 2020 a shs
35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
34      Thu Apr  2 18:00:00 2020 a shs

如果你需要取消队列中的一个作业,使用 atrm(at remove)命令和作业编号:

$ atrm 32
$ atq
35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
34      Thu Apr  2 18:00:00 2020 a shs

你可以使用 at -c 命令来查看安排任务的详细信息,其它详细信息(活动的搜索路径等)也可以看到,但是输出的最后一行将显示计划运行的命令。

$ at -c 36 | tail -6
cd /home/shs || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
date >> thisfile

注意,该命令显示首先会测试是否可以通过 cd 命令进入用户目录。如果不可以,作业将退出并显示错误。如果可以,则运行在 at 中指定的命令。它将命令视为 “进入 /home/shs 或退出并显示错误”。

以 root 身份运行作业

要以 root 身份运行 at 作业,只需将 sudo 与你的 at 命令一起使用,如下所示:

$ sudo at 8PM
[sudo] password for shs:
warning: commands will be executed using /bin/sh
at> reboot now
at> <EOT>
job 37 at Wed Apr  1 16:00:00 2020

注意,root 的任务以 root 作为执行者显示在队列中。

35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
37      Wed Apr  1 20:00:00 2020 a root         <==

运行脚本

你还可以使用 at 命令来运行脚本,这里有一个例子:

$ at 4:30PM
warning: commands will be executed using /bin/sh
at> bin/tryme
at> <EOT>

禁止使用 at 命令

/etc/at.deny 文件提供了一种禁止用户使用 at 命令的方法。默认情况下,它可能会包含一个不允许的账户列表,例如 ftpnobody。可以使用 /etc/at.allow 文件执行相反的操作,但是通常只配置 at.deny 文件。

总结

当你要安排一项一次性任务时,无论你是希望在今天下午或几年后运行,at 命令都是通用且易于使用的。


via: https://www.networkworld.com/article/3535808/scheduling-tasks-on-linux-using-the-at-command.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用循环和查找命令批量自动对多个文件进行一系列的操作。

人们希望学习批处理命令的一个普遍原因是要得到批处理强大的功能。如果你希望批量的对文件执行一些指令,构造一个可以重复运行在那些文件上的命令就是一种方法。在编程术语中,这被称作执行控制for 循环就是其中最常见的一种。

for 循环可以详细描述你希望计算机对你指定的每个数据对象(比如说文件)所进行的操作。

一般的循环

使用循环的一个简单例子是对一组文件进行分析。这个循环可能没什么用,但是这是一个安全的证明自己有能力独立处理文件夹里每一个文件的方法。首先,创建一个文件夹然后拷贝一些文件(例如 JPEG、PNG 等类似的文件)至文件夹中生成一个测试环境。你可以通过文件管理器或者终端来完成创建文件夹和拷贝文件的操作:

$ mkdir example
$ cp ~/Pictures/vacation/*.{png,jpg} example

切换到你刚创建的那个新文件夹,然后列出文件并确认这个测试环境是你需要的:

$ cd example
$ ls -1
cat.jpg
design_maori.png
otago.jpg
waterfall.png

在循环中逐一遍历文件的语法是:首先声明一个变量(例如使用 f 代表文件),然后定义一个你希望用变量循环的数据集。在这种情况下,使用 * 通配符来遍历当前文件夹下的所有文件(通配符 * 匹配所有文件)。然后使用一个分号(;)来结束这个语句。

$ for f in * ;

取决于你个人的喜好,你可以选择在这里按下回车键。在语法完成前,shell 是不会尝试执行这个循环的。

接下来,定义你想在每次循环中进行的操作。简单起见,使用 file 命令来得到 f 变量(使用 $ 告诉 shell 使用这个变量的值,无论这个变量现在存储着什么)所存储着的文件的各种信息:

do file $f ;

使用另一个分号结束这一行,然后关闭这个循环:

done

按下回车键启动 shell 对当前文件夹下所有东西的遍历。for 循环将会一个一个的将文件分配给变量 f 并且执行你的命令:

$ for f in * ; do
> file $f ;
> done
cat.jpg: JPEG image data, EXIF standard 2.2
design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced
otago.jpg: JPEG image data, EXIF standard 2.2
waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

你也可以用这种形式书写命令:

$ for f in *; do file $f; done
cat.jpg: JPEG image data, EXIF standard 2.2
design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced
otago.jpg: JPEG image data, EXIF standard 2.2
waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

对你的 shell 来说,多行和单行的格式没有什么区别,并且会输出完全一样的结果。

一个实用的例子

下面是一个循环在日常使用中的实用案例。假如你拥有一堆假期拍的照片想要发给你的朋友。但你的照片太大了,无法通过电子邮件发送,上传到图片分享服务也不方便。因此你想为你的照片创建小型的 web 版本,但是你不希望花费太多时间在一个一个的压缩图片体积上。

首先,在你的 Linux、BSD 或者 Mac 上使用包管理器安装 ImageMagick 命令。例如,在 Fedora 和 RHEL 上:

$ sudo dnf install ImageMagick

在 Ubuntu 和 Debian 上:

$ sudo apt install ImageMagick

在 BSD 上,使用 ports 或者 pkgsrc 安装。在 Mac 上,使用 Homebrew 或者 MacPorts 安装。

在你安装了 ImageMagick 之后,你就拥有一系列可以用来操作图片的新命令了。

为你将要创建的文件建立一个目标文件夹:

$ mkdir tmp

使用下面的循环可以将每张图片减小至原来大小的 33%。

$ for f in * ; do convert $f -scale 33% tmp/$f ; done

然后就可以在 tmp 文件夹中看到已经缩小了的照片了。

你可以在循环体中使用任意数量的命令,因此如果你需要对一批文件进行复杂的操作,可以将你的命令放在一个 for 循环的 dodone 语句之间。例如,假设你希望将所有处理过的图片拷贝至你的网站所托管的图片文件夹并且在本地系统移除这些文件:

$ for f in * ; do
  convert $f -scale 33% tmp/$f
  scp -i seth_web tmp/$f [email protected]:~/public_html
  trash tmp/$f ;
done

你的计算机会对 for 循环中处理的每一个文件自动的执行 3 条命令。这意味着假如你仅仅处理 10 张图片,也会省下输入 30 条指令和更多的时间。

限制你的循环

一个循环常常不需要处理所有文件。在示例文件夹中,你可能需要处理的只是 JPEG 文件:

$ for f in *.jpg ; do convert $f -scale 33% tmp/$f ; done
$ ls -m tmp
cat.jpg, otago.jpg

或者,你希望重复特定次数的某个操作而不仅仅只处理文件。for 循环的变量的值是被你赋给它的(不管何种类型的)数据所决定的,所以你可以创建一个循环遍历数字而不只是文件:

$ for n in {0..4}; do echo $n ; done
0
1
2
3
4

更多循环

现在你了解的知识已经足够用来创建自己的循环体了。直到你对循环非常熟悉之前,尽可能的在需要处理的文件的副本上进行操作。使用内置的保护措施可以预防损坏自己的数据和制造不可复现的错误,例如偶然将一个文件夹下的所有文件重命名为同一个名字,就可能会导致他们的相互覆盖。

更进一步的 for 循环话题,请继续阅读。

不是所有的 shell 都是 Bash

关键字 for 是内置在 Bash shell 中的。许多类似的 shell 会使用和 Bash 同样的关键字和语法,但是也有某些 shell ,比如 tcsh,使用不同的关键字,例如 foreach

tcsh 的语法与 Bash 类似,但是它更为严格。例如在下面的例子中,不要在你的终端的第 2、3 行键入 foreach? 。它只是提示你仍处在构建循环的过程中。

$ foreach f (*)
foreach? file $f
foreach? end
cat.jpg: JPEG image data, EXIF standard 2.2
design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced
otago.jpg: JPEG image data, EXIF standard 2.2
waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

在 tcsh 中,foreachend 都必须单独的在一行中出现。因此你不能像 Bash 或者其他类似的 shell 一样只使用一行命令创建一个 for 循环。

for 循环与 find 命令

理论上,你可能会用到不支持 for 循环的 shell,或者你只是更想使用其他命令的一些特性来完成和循环一样的工作。

使用 find 命令是另一个实现 for 循环功能的途径。这个命令提供了多种方法来定义循环中包含哪些文件的范围以及并行处理的选项。

find 命令顾名思义就是帮助你查询存储在硬盘里的文件。它的用法很简单:提供一个你希望它查询的位置的路径,接着 find 就会查询这个路径下面的所有文件和文件夹。

$ find .
.
./cat.jpg
./design_maori.png
./otago.jpg
./waterfall.png

你可以通过添加名称的某些部分来过滤搜索结果:

$ find . -name "*jpg"
./cat.jpg
./otago.jpg

find 命令非常好的地方在于你可以通过 -exec 参数标志将它查询到的每一个文件放入循环中。例如,只对存放在你的 example 文件夹下的 PNG 图片进行体积压缩操作:

$ find . -name "*png" -exec convert {} -scale 33% tmp/{} \;
$ ls -m tmp
design_maori.png, waterfall.png

-exec 短语中,括号 {} 表示的是 find 正在处理的条目(换句话说,每一个被找到的以 PNG 结尾的文件)。-exec 短语必须使用分号结尾,但是 Bash 中常常也会使用分号。为了解决这个二义性问题,你的 结束符 可以使用反斜杠加上一个分号(\;),使得 find 命令可以知道这个结束符是用来标识自己结束使用的。

find 命令的操作非常棒,某些情况下它甚至可以表现得更棒。比如说,在一个新的进程中使用同一条命令查找 PNG 文件,你可能就会得到一些错误信息:

$ find . -name "*png" -exec convert {} -flip -flop tmp/{} \;
convert: unable to open image `tmp/./tmp/design_maori.png':
No such file or directory @ error/blob.c/OpenBlob/2643.
...

看起来 find 不只是定位了当前文件夹(.)下的所有 PNG 文件,还包括已经处理并且存储到了 tmp 下的文件。在一些情况下,你可能希望 find 查询当前文件夹下再加上其子文件夹下的所有文件。find 命令是一个功能强大的递归工具,特别体现在处理一些文件结构复杂的情境下(比如用来放置存满了音乐人音乐专辑的文件夹),同时你也可以使用 -maxdepth 选项来限制最大的递归深度。

只在当前文件夹下查找 PNG 文件(不包括子文件夹):

$ find . -maxdepth 1 -name "*png"

上一条命令的最大深度再加 1 就可以查找和处理当前文件夹及下一级子文件夹下面的文件:

$ find . -maxdepth 2 -name "*png"

find 命令默认是查找每一级文件夹。

循环的乐趣与收益

你使用的循环越多,你就可以越多的省下时间和力气,并且可以应对庞大的任务。虽然你只是一个用户,但是通过使用循环,可以使你的计算机完成困难的任务。

你可以并且应该就像使用其他的命令一样使用循环。在你需要重复处理单个或多个文件时,尽可能的使用这个命令。无论如何,这也算是一项需要被严肃对待的编程活动,因此如果你需要在一些文件上完成复杂的任务,你应该多花点时间在规划自己的工作流上面。如果你可以在一份文件上完成你的工作,接下来将操作包装进 for 循环里就相对简单了,这里面唯一的“编程”的需要只是理解变量是如何工作的并且进行充分的规划工作将已处理过的文件和未处理过的文件分开。经过一段时间的练习,你就可以从一名 Linux 用户升级成一位知道如何使用循环的 Linux 用户,所以开始让计算机为你工作吧!


via: https://opensource.com/article/19/6/how-write-loop-bash

作者:Seth Kenlon 选题:lujun9972 译者:chunibyo-wly 校对:wxy

本文由 LCTT 原创编译,Linux 中国 荣誉推出