分类 技术 下的文章

你可能有时需要在 Linux 上创建或者删除符号链接。如果有,你知道该怎样做吗?之前你做过吗?你踩坑没有?如果你踩过坑,那没什么问题。如果还没有,别担心,我们将在这里帮助你。

使用 rmunlink 命令就能完成移除(删除)符号链接的操作。

什么是符号链接?

符号链接(symlink)又称软链接,它是一种特殊的文件类型,在 Linux 中该文件指向另一个文件或者目录。它类似于 Windows 中的快捷方式。它能在相同或者不同的文件系统或分区中指向一个文件或着目录。

符号链接通常用来链接库文件。它也可用于链接日志文件和挂载的 NFS(网络文件系统)上的文件夹。

什么是 rm 命令?

rm 命令 被用来移除文件和目录。它非常危险,你每次使用 rm 命令的时候要非常小心。

什么是 unlink 命令?

unlink 命令被用来移除特殊的文件。它被作为 GNU Gorutils 的一部分安装了。

1) 使用 rm 命令怎样移除符号链接文件

rm 命令是在 Linux 中使用最频繁的命令,它允许我们像下列描述那样去移除符号链接。

# rm symlinkfile

始终将 rm 命令与 -i 一起使用以了解正在执行的操作。

# rm -i symlinkfile1
rm: remove symbolic link ‘symlinkfile1’? y

它允许我们一次移除多个符号链接:

# rm -i symlinkfile2 symlinkfile3

rm: remove symbolic link ‘symlinkfile2’? y
rm: remove symbolic link ‘symlinkfile3’? y

1a) 使用 rm 命令怎样移除符号链接目录

这像移除符号链接文件那样。使用下列命令移除符号链接目录。

# rm -i symlinkdir

rm: remove symbolic link ‘symlinkdir’? y

使用下列命令移除多个符号链接目录。

# rm -i symlinkdir1 symlinkdir2

rm: remove symbolic link ‘symlinkdir1’? y
rm: remove symbolic link ‘symlinkdir2’? y

如果你在结尾增加 /,这个符号链接目录将不会被删除。如果你加了,你将得到一个错误。

# rm -i symlinkdir/

rm: cannot remove ‘symlinkdir/’: Is a directory

你可以增加 -r 去处理上述问题。但如果你增加这个参数,它将会删除目标目录下的内容,并且它不会删除这个符号链接文件。(LCTT 译注:这可能不是你的原意。)

# rm -ri symlinkdir/

rm: descend into directory ‘symlinkdir/’? y
rm: remove regular file ‘symlinkdir/file4.txt’? y
rm: remove directory ‘symlinkdir/’? y
rm: cannot remove ‘symlinkdir/’: Not a directory

2) 使用 unlink 命令怎样移除符号链接

unlink 命令删除指定文件。它一次仅接受一个文件。

删除符号链接文件:

# unlink symlinkfile

删除符号链接目录:

# unlink symlinkdir2

如果你在结尾增加 /,你不能使用 unlink 命令删除符号链接目录。

# unlink symlinkdir3/

unlink: cannot unlink ‘symlinkdir3/’: Not a directory

via: https://www.2daygeek.com/remove-delete-symbolic-link-softlink-linux/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:arrowfeng 校对:wxy

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

无论你是刚接触 Linux 的文件移动的新手还是已有丰富的经验,你都可以通过此深入的文章中学到一些东西。

在 Linux 中移动文件看似比较简单,但是可用的选项却比大多数人想象的要多。本文介绍了初学者如何在 GUI 和命令行中移动文件,还介绍了底层实际上发生了什么,并介绍了许多有一定经验的用户也很少使用的命令行选项。

移动什么?

在研究移动文件之前,有必要仔细研究移动文件系统对象时实际发生的情况。当文件创建后,会将其分配给一个 索引节点 inode ,这是文件系统中用于数据存储的固定点。你可以使用 ls 命令看到文件对应的索引节点:

$ ls --inode example.txt
7344977 example.txt

移动文件时,实际上并没有将数据从一个索引节点移动到另一个索引节点,只是给文件对象分配了新的名称或文件路径而已。实际上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建文件。(LCTT 译注:在不跨卷、分区和存储器时,移动文件是不会重新创建文件的;反之亦然)

文件和目录的索引节点并没有暗示这种继承关系,而是由文件系统本身决定的。索引节点的分配是基于文件创建时的顺序分配的,并且完全独立于你组织计算机文件的方式。一个目录“内”的文件的索引节点号可能比其父目录的索引节点号更低或更高。例如:

$ mkdir foo
$ mv example.txt foo
$ ls --inode
7476865 foo
$ ls --inode foo
7344977 example.txt

但是,将文件从一个硬盘驱动器移动到另一个硬盘驱动器时,索引节点基本上会更改。发生这种情况是因为必须将新数据写入新文件系统。因此,在 Linux 中,移动和重命名文件的操作实际上是相同的操作。无论你将文件移动到另一个目录还是在同一目录使用新名称,这两个操作均由同一个底层程序执行。

本文重点介绍将文件从一个目录移动到另一个目录。

用鼠标移动文件

图形用户界面是大多数人都熟悉的友好的抽象层,位于复杂的二进制数据集合之上。这也是在 Linux 桌面上移动文件的首选方法,也是最直观的方法。从一般意义上来说,如果你习惯使用台式机,那么你可能已经知道如何在硬盘驱动器上移动文件。例如,在 GNOME 桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是该桌面上最直观的操作之一:

 title=

而 KDE Plasma 桌面中的 Dolphin 文件管理器默认情况下会提示用户以执行不同的操作。拖动文件时按住 Shift 键可强制执行移动操作:

 title=

在命令行移动文件

用于在 Linux、BSD、Illumos、Solaris 和 MacOS 上移动文件的 shell 命令是 mv。不言自明,简单的命令 mv <source> <destination> 会将源文件移动到指定的目标,源和目标都由绝对相对文件路径定义。如前所述,mvPOSIX 用户的常用命令,其有很多不为人知的附加选项,因此,无论你是新手还是有经验的人,本文都会为你带来一些有用的选项。

但是,不是所有 mv 命令都是由同一个人编写的,因此取决于你的操作系统,你可能拥有 GNU mv、BSD mv 或 Sun mv。命令的选项因其实现而异(BSD mv 根本没有长选项),因此请参阅你的 mv 手册页以查看支持的内容,或安装你的首选版本(这是开源的奢侈之处)。

移动文件

要使用 mv 将文件从一个文件夹移动到另一个文件夹,请记住语法 mv <source> <destination>。 例如,要将文件 example.txt 移到你的 Documents 目录中:

$ touch example.txt
$ mv example.txt ~/Documents
$ ls ~/Documents
example.txt

就像你通过将文件拖放到文件夹图标上来移动文件一样,此命令不会将 Documents 替换为 example.txt。相反,mv 会检测到 Documents 是一个文件夹,并将 example.txt 文件放入其中。

你还可以方便地在移动文件时重命名该文件:

$ touch example.txt
$ mv example.txt ~/Documents/foo.txt
$ ls ~/Documents
foo.txt

这很重要,这使你不用将文件移动到另一个位置,也可以重命名文件,例如:

$ touch example.txt 
$ mv example.txt foo2.txt 
$ ls foo2.txt`

移动目录

不像 cp 命令,mv 命令处理文件和目录没有什么不同,你可以用同样的格式移动目录或文件:

$ touch file.txt
$ mkdir foo_directory
$ mv file.txt foo_directory
$ mv foo_directory ~/Documents

安全地移动文件

如果你移动一个文件到一个已有同名文件的地方,默认情况下,mv 会用你移动的文件替换目标文件。这种行为被称为 清除 clobbering ,有时候这就是你想要的结果,而有时则不是。

一些发行版将 mv 别名定义为 mv --interactive(你也可以自己写一个),这会提醒你确认是否覆盖。而另外一些发行版没有这样做,那么你可以使用 --interactive-i 选项来确保当两个文件有一样的名字而发生冲突时让 mv 请你来确认。

$ mv --interactive example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'?

如果你不想手动干预,那么可以使用 --no-clobber-n。该选项会在发生冲突时静默拒绝移动操作。在这个例子当中,一个名为 example.txt 的文件以及存在于 ~/Documents,所以它不会如命令要求从当前目录移走。

$ mv --no-clobber example.txt ~/Documents
$ ls
example.txt

带备份的移动

如果你使用 GNU mv,有一个备份选项提供了另外一种安全移动的方式。要为任何冲突的目标文件创建备份文件,可以使用 -b 选项。

$ mv -b example.txt ~/Documents
$ ls ~/Documents
example.txt    example.txt~

这个选项可以确保 mv 完成移动操作,但是也会保护目录位置的已有文件。

另外的 GNU 备份选项是 --backup,它带有一个定义了备份文件如何命名的参数。

  • existing:如果在目标位置已经存在了编号备份文件,那么会创建编号备份。否则,会使用 simple 方式。
  • none:即使设置了 --backup,也不会创建备份。当 mv 被别名定义为带有备份选项时,这个选项可以覆盖这种行为。
  • numbered:给目标文件名附加一个编号。
  • simple:给目标文件附加一个 ~,当你日常使用带有 --ignore-backups 选项的 ls 时,这些文件可以很方便地隐藏起来。

简单来说:

$ mv --backup=numbered example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~

可以使用环境变量 VERSION_CONTROL 设置默认的备份方案。你可以在 ~/.bashrc 文件中设置该环境变量,也可以在命令前动态设置:

$ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~

--backup 选项仍然遵循 --interactive-i 选项,因此即使它在执行备份之前创建了备份,它仍会提示你覆盖目标文件:

$ mv --backup=numbered example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'? y
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:24 example.txt
-rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt.~3~

你可以使用 --force-f 选项覆盖 -i

$ mv --backup=numbered --force example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:26 example.txt
-rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug  1 17:24 example.txt.~3~
-rw-rw-r--. 1 seth users 128 Aug  1 17:25 example.txt.~4~

--backup 选项在 BSD mv 中不可用。

一次性移动多个文件

移动多个文件时,mv 会将最终目录视为目标:

$ mv foo bar baz ~/Documents
$ ls ~/Documents
foo   bar   baz

如果最后一个项目不是目录,则 mv 返回错误:

$ mv foo bar baz
mv: target 'baz' is not a directory

GNU mv 的语法相当灵活。如果无法把目标目录作为提供给 mv 命令的最终参数,请使用 --target-directory-t 选项:

$ mv --target-directory=~/Documents foo bar baz
$ ls ~/Documents
foo   bar   baz

当从某些其他命令的输出构造 mv 命令时(例如 find 命令、xargsGNU Parallel),这特别有用。

基于修改时间移动

使用 GNU mv,你可以根据要移动的文件是否比要替换的目标文件新来定义移动动作。该方式可以通过 --update-u 选项使用,在BSD mv 中不可用:

$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:32 example.txt
$ ls -l
-rw-rw-r--. 1 seth users 128 Aug  1 17:42 example.txt
$ mv --update example.txt ~/Documents
$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug  1 17:42 example.txt
$ ls -l

此结果仅基于文件的修改时间,而不是两个文件的差异,因此请谨慎使用。只需使用 touch 命令即可愚弄 mv

$ cat example.txt
one
$ cat ~/Documents/example.txt
one
two
$ touch example.txt
$ mv --update example.txt ~/Documents
$ cat ~/Documents/example.txt
one

显然,这不是最智能的更新功能,但是它提供了防止覆盖最新数据的基本保护。

移动

除了 mv 命令以外,还有更多的移动数据的方法,但是作为这项任务的默认程序,mv 是一个很好的通用选择。现在你知道了有哪些可以使用的选项,可以比以前更智能地使用 mv 了。


via: https://opensource.com/article/19/8/moving-files-linux-depth

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

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

我觉得前几天的 curl 练习进展顺利,所以今天我醒来后,想尝试编写一些 Git 练习。Git 是一大块需要学习的技能,可能要花几个小时才能学会,所以我分解练习的第一个思路是从“导航”一个存储库开始的。

我本来打算使用一个玩具测试库,但后来我想,为什么不使用真正的存储库呢?这样更有趣!因此,我们将浏览 Ruby 编程语言的存储库。你无需了解任何 C 即可完成此练习,只需熟悉一下存储库中的文件随时间变化的方式即可。

克隆存储库

开始之前,需要克隆存储库:

git clone https://github.com/ruby/ruby

与实际使用的大多数存储库相比,该存储库的最大不同之处在于它没有分支,但是它有很多标签,它们与分支相似,因为它们都只是指向一个提交的指针而已。因此,我们将使用标签而不是分支进行练习。改变标签的方式和分支非常不同,但查看标签和分支的方式完全相同。

Git SHA 总是引用同一个代码

执行这些练习时要记住的最重要的一点是,如本页面所述,像9e3d9a2a009d2a0281802a84e1c5cc1c887edc71 这样的 Git SHA 始终引用同一个的代码。下图摘自我与凯蒂·西勒·米勒撰写的一本杂志,名为《Oh shit, git!》。(她还有一个名为 https://ohshitgit.com/ 的很棒的网站,启发了该杂志。)

我们将在练习中大量使用 Git SHA,以使你习惯于使用它们,并帮助你了解它们与标签和分支的对应关系。

我们将要使用的 Git 子命令

所有这些练习仅使用这 5 个 Git 子命令:

git checkout
git log (--oneline, --author, and -S will be useful)
git diff (--stat will be useful)
git show
git status

练习

  1. 查看 matz 从 1998 年开始的 Ruby 提交。提交 ID 为 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4。找出当时 Ruby 的代码行数。
  2. 检出当前的 master 分支。
  3. 查看文件 hash.c 的历史记录。更改该文件的最后一个提交 ID 是什么?
  4. 了解最近 20 年来 hash.c 的变化:将 master 分支上的文件与提交 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4 的文件进行比较。
  5. 查找最近更改了 hash.c 的提交,并查看该提交的差异。
  6. 对于每个 Ruby 版本,该存储库都有一堆标签。获取所有标签的列表。
  7. 找出在标签 v1_8_6_187 和标签 v1_8_6_188 之间更改了多少文件。
  8. 查找 2015 年的提交(任何一个提交)并将其检出,简单地查看一下文件,然后返回 master 分支。
  9. 找出标签 v1_8_6_187 对应的提交。
  10. 列出目录 .git/refs/tags。运行 cat .git/refs/tags/v1_8_6_187 来查看其中一个文件的内容。
  11. 找出当前 HEAD 对应的提交 ID。
  12. 找出已经对 test/ 目录进行了多少次提交。
  13. 提交 65a5162550f58047974793cdc8067a970b2435c09e3d9a2a009d2a0281802a84e1c5cc1c887edc71 之间的 lib/telnet.rb 的差异。该文件更改了几行?
  14. 在 Ruby 2.5.1 和 2.5.2 之间进行了多少次提交(标记为 v2_5_1v2_5_3)(这一步有点棘手,步骤不只一步)
  15. “matz”(Ruby 的创建者)作了多少提交?
  16. 最近包含 “tkutil” 一词的提交是什么?
  17. 检出提交 e51dca2596db9567bd4d698b18b4d300575d3881 并创建一个指向该提交的新分支。
  18. 运行 git reflog 以查看你到目前为止完成的所有存储库导航操作。 ——————————————————————————–

via: https://jvns.ca/blog/2019/08/30/git-exercises–navigate-a-repository/

作者:Julia Evans 选题:lujun9972 译者:wxy 校对:wxy

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

从 Bash 进阶到 Z-shell,改进你的 shell 体验。

Z-shell(Zsh)是一种 Bourne 式的交互式 POSIX shell,以其丰富的创新功能而著称。Z-Shell 用户经常会提及它的许多便利之处,赞誉它对效率的提高和丰富的自定义支持。

如果你刚接触 Linux 或 Unix,但你的经验足以让你可以打开终端并运行一些命令的话,那么你可能使用的就是 Bash shell。Bash 可能是最具有代表意义的自由软件 shell,部分是因为它具有的先进的功能,部分是因为它是大多数流行的 Linux 和 Unix 操作系统上的默认 shell。但是,随着使用的次数越多,你可能会开始发现一些细节可能能够做的更好。开源有一个众所周知的地方,那就是选择。所以,许多人选择从 Bash “毕业”到 Z。

Zsh 介绍

Shell 只是操作系统的接口。交互式 shell 程序允许你通过称为标准输入(stdin)的某个东西键入命令,并通过标准输出(stdout)和标准错误(stderr)获取输出。有很多种 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每个都有其开发者所认为最适合于 Shell 的功能。而这些功能的好坏,则取决于最终用户。

Zsh 具有交互式制表符补全、自动文件搜索、支持正则表达式、用于定义命令范围的高级速记符,以及丰富的主题引擎等功能。这些功能也包含在你所熟悉的其它 Bourne 式 shell 环境中,这意味着,如果你已经了解并喜欢 Bash,那么你也会熟悉 Zsh,除此以外,它还有更多的功能。你可能会认为它是一种 Bash++。

安装 Zsh

用你的包管理器安装 Zsh。

在 Fedora、RHEL 和 CentOS 上:

$ sudo dnf install zsh

在 Ubuntu 和 Debian 上:

$ sudo apt install zsh

在 MacOS 上你可以使用 MacPorts 安装它:

$ sudo port install zsh

或使用 Homebrew:

$ brew install zsh

在 Windows 上也可以运行 Zsh,但是只能在 Linux 层或类似 Linux 的层之上运行,例如 Windows 的 Linux 子系统(WSL)或 Cygwin。这类安装超出了本文的范围,因此请参考微软的文档。

设置 Zsh

Zsh 不是终端模拟器。它是在终端仿真器中运行的 shell。因此,要启动 Zsh,必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或你喜欢的其它终端。然后,你可以通过键入以下命令启动 Zsh:

$ zsh

首次启动 Zsh 时,会要求你选择一些配置选项。这些都可以在以后更改,因此请按 1 继续。

This is the Z Shell configuration function for new users, zsh-newuser-install.

(q)  Quit and do nothing.

(0)  Exit, creating the file ~/.zshrc

(1)  Continue to the main menu.

偏好设置分为四类,因此请从顶部开始。

  1. 第一个类使你可以选择在 shell 历史记录文件中保留多少个命令。默认情况下,它设置为 1,000 行。
  2. Zsh 补全是其最令人兴奋的功能之一。为了简单起见,请考虑使用其默认选项激活它,直到你习惯了它的工作方式。按 1 使用默认选项,按 2 手动设置选项。
  3. 选择 Emacs 式键绑定或 Vi 式键绑定。Bash 使用 Emacs 式绑定,因此你可能已经习惯了。
  4. 最后,你可以了解(以及设置或取消设置)Zsh 的一些精妙的功能。例如,当你提供不带命令的非可执行路径时,可以通过让 Zsh 来改变目录而无需你使用 cd 命令。要激活这些额外选项之一,请输入选项号并输入 s 进行设置。请尝试打开所有选项以获得完整的 Zsh 体验。你可以稍后通过编辑 ~/.zshrc 取消设置它们。

要完成配置,请按 0

使用 Zsh

刚开始,Zsh 的使用感受就像使用 Bash 一样,这无疑是其众多功能之一。例如,Bash 和 Tcsh 之间就存在严重的差异,因此如果你必须在工作中或在服务器上使用 Bash,而 Zsh 就可以在家里轻松尝试和使用,这样在 Bash 和 Zsh 之间轻松切换就是一种便利。

在 Zsh 中改变目录

正是这些微小的差异使 Zsh 变得好用。首先,尝试在没有 cd 命令的情况下,将目录更改为 Documents 文件夹。简直太棒了,难以置信。如果你输入的是目录路径而没有进一步的指令,Zsh 会更改为该目录:

% Documents
% pwd
/home/seth/Documents

而这会在 Bash 或任何其他普通 shell 中导致错误。但是 Zsh 却根本不是普通的 shell,而这仅仅才是开始。

在 Zsh 中搜索

当你想使用普通 shell 程序查找文件时,可以使用 findlocate 命令。最起码,你可以使用 ls -R 来递归地列出一组目录。Zsh 内置有允许它在当前目录或任何其他子目录中查找文件的功能。

例如,假设你有两个名为 foo.txt 的文件。一个位于你的当前目录中,另一个位于名为 foo 的子目录中。在 Bash Shell 中,你可以使用以下命令列出当前目录中的文件:

$ ls
foo.txt

你可以通过明确指明子目录的路径来列出另一个目录:

$ ls foo
foo.txt

要同时列出这两者,你必须使用 -R 开关,并结合使用 grep

$ ls -R | grep foo.txt
foo.txt
foo.txt

但是在 Zsh 中,你可以使用 ** 速记符号:

% ls **/foo.txt
foo.txt
foo.txt

你可以在任何命令中使用此语法,而不仅限于 ls。想象一下在这样的场景中提高的效率:将特定文件类型从一组目录中移动到单个位置、将文本片段串联到一个文件中,或对日志进行抽取。

使用 Zsh 的制表符补全

制表符补全是 Bash 和其他一些 Shell 中的高级用户功能,它变得司空见惯,席卷了 Unix 世界。Unix 用户不再需要在输入冗长而乏味的路径时使用通配符(例如输入 /h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v,比输入 /home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv 要容易得多)。相反,他们只要输入足够的唯一字符串即可按 Tab 键。例如,如果你知道在系统的根目录下只有一个以 h 开头的目录,则可以键入 /h,然后单击 Tab。快速、简单、高效。它还会确认路径存在;如果 Tab 无法完成任何操作,则说明你在错误的位置或输入了错误的路径部分。

但是,如果你有许多目录有五个或更多相同的首字母,Tab 会坚决拒绝进行补全。尽管在大多数现代终端中,它将(至少会)显示阻止其进行猜测你的意思的文件,但通常需要按两次 Tab 键才能显示它们。因此,制表符补全通常会变成来回按下键盘上字母和制表符,以至于你好像在接受钢琴独奏会的训练。

Zsh 通过循环可能的补全来解决这个小问题。如果键入 ls ~/D 并按 Tab,则 Zsh 首先使用 Documents 来完成命令;如果再次按 Tab,它将提供 Downloads,依此类推,直到找到所需的选项。

Zsh 中的通配符

在 Zsh 中,通配符的行为不同于 Bash 中用户所习惯的行为。首先,可以对其进行修改。例如,如果要列出当前目录中的所有文件夹,则可以使用修改后的通配符:

% ls
dir0   dir1   dir2   file0   file1
% ls *(/)
dir0   dir1   dir2

在此示例中,(/) 限定了通配符的结果,因此 Zsh 仅显示目录。要仅列出文件,请使用 (.)。要列出符号链接,请使用 (@)。要列出可执行文件,请使用 (*)

% ls ~/bin/*(*)
fop  exify  tt

Zsh 不仅仅知道文件类型。它也可以使用相同的通配符修饰符约定根据修改时间列出。例如,如果要查找在过去八个小时内修改的文件,请使用 mh 修饰符(即 “modified hours” 的缩写)和小时的负整数:

% ls ~/Documents/*(mh-8)
cal.org   game.org   home.org

要查找超过(例如)两天前修改过的文件,修饰符更改为 md(即 “modified day” 的缩写),并带上天数的正整数:

% ls ~/Documents/*(+2)
holiday.org

通配符修饰符和限定符还可以做很多事情,因此,请阅读 Zsh 手册页,以获取全部详细信息。

通配符的副作用

要像在 Bash 中使用通配符一样使用它,有时必须在 Zsh 中对通配符进行转义。例如,如果要在 Bash 中将某些文件复制到服务器上,则可以使用如下通配符:

$ scp IMG_*.JPG [email protected]:~/www/ph*/*19/09/14

这在 Bash 中有效,但是在 Zsh 中会返回错误,因为它在发出 scp 命令之前尝试在远程端扩展该变量(通配符)。为避免这种情况,必须转义远程变量(通配符):

% scp IMG_*.JPG [email protected]:~/www/ph\*/\*19/09/14

当你切换到新的 shell 时,这些小异常可能会使你感到沮丧。使用 Zsh 时会遇到的问题不多(体验过 Zsh 后切换回 Bash 的可能遇到更多),但是当它们发生时,请保持镇定且坦率。严格遵守 POSIX 的情况很少会出错,但是如果失败了,请查找问题以解决并继续。对于许多在工作中困在一个 shell 上而在家中困在另一个 shell 上的用户来说,hyperpolyglot.org 已被证明其是无价的。

在我的下一篇 Zsh 文章中,我将向你展示如何安装主题和插件以定制你的 Z-Shell 甚至 Z-ier。


via: https://opensource.com/article/19/9/getting-started-zsh

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

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

我喜欢互联网的一点是在互联网放置静态页面是如此简单。今天有人问我该怎么做,所以我想我会快速地写下来!

只是一个 HTML 页面

我的所有网站都只是静态 HTML 和 CSS。我的网页设计技巧相对不高(https://wizardzines.com 是我自己开发的最复杂的网站),因此保持我所有的网站相对简单意味着我可以做一些改变/修复,而不会花费大量时间。

因此,我们将在此文章中采用尽可能简单的方式 —— 只需一个 HTML 页面。

HTML 页面

我们要放在互联网上的网站只是一个名为 index.html 的文件。你可以在 https://github.com/jvns/website-example 找到它,它是一个 Github 仓库,其中只包含一个文件。

HTML 文件中包含一些 CSS,使其看起来不那么无聊,部分复制自 https://example.com

如何将 HTML 页面放在互联网上

有以下几步:

  1. 注册 Neocities 帐户
  2. 将 index.html 复制到你自己 neocities 站点的 index.html 中
  3. 完成

上面的 index.html 页面位于 julia-example-website.neocities.com 中,如果你查看源代码,你将看到它与 github 仓库中的 HTML 相同。

我认为这可能是将 HTML 页面放在互联网上的最简单的方法(这是一次回归 Geocities,它是我在 2003 年制作我的第一个网站的方式):)。我也喜欢 Neocities (像 glitch,我也喜欢)它能实验、学习,并有乐趣。

其他选择

这绝不是唯一简单的方式,在你推送 Git 仓库时,Github pages 和 Gitlab pages 以及 Netlify 都将会自动发布站点,并且它们都非常易于使用(只需将它们连接到你的 GitHub 仓库即可)。我个人使用 Git 仓库的方式,因为 Git 不会让我感到紧张,我想知道我实际推送的页面发生了什么更改。但我想你如果第一次只想将 HTML/CSS 制作的站点放到互联网上,那么 Neocities 就是一个非常好的方法。

如果你不只是玩,而是要将网站用于真实用途,那么你或许会需要买一个域名,以便你将来可以更改托管服务提供商,但这有点不那么简单。

这是学习 HTML 的一个很好的起点

如果你熟悉在 Git 中编辑文件,同时想练习 HTML/CSS 的话,我认为将它放在网站中是一个有趣的方式!我真的很喜欢它的简单性 —— 实际上这只有一个文件,所以没有其他花哨的东西需要去理解。

还有很多方法可以复杂化/扩展它,比如这个博客实际上是用 Hugo 生成的,它生成了一堆 HTML 文件并放在网络中,但从基础开始总是不错的。


via: https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/

作者:Julia Evans 选题:lujun9972 译者:geekpi 校对:wxy

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

Scipio ERP 具有包罗万象的应用程序和功能。

如果,你想在网上销售产品或服务,但要么找不到合适的软件,要么觉得定制成本太高?那么,Scipio ERP 也许正是你想要的。

Scipio ERP 是一个基于 Java 的开源的电子商务框架,具有包罗万象的应用程序和功能。这个项目于 2014 年从 Apache OFBiz 分叉而来,侧重于更好的定制和更现代的吸引力。这个电子商务组件非常丰富,可以在多商店环境中工作,同时支持国际化,具有琳琅满目的产品配置,而且它还兼容现代 HTML 框架。该软件还为许多其他业务场景提供标准应用程序,例如会计、仓库管理或销售团队自动化。它都是高度标准化的,因此易于定制,如果你想要的不仅仅是一个虚拟购物车,这是非常棒的。

该系统也使得跟上现代 Web 标准变得非常容易。所有界面都是使用系统的“模板工具包”构建的,这是一个易于学习的宏集,可以将 HTML 与所有应用程序分开。正因为如此,每个应用程序都已经标准化到核心。听起来令人困惑?它真的不是 HTML——它看起来很像 HTML,但你写的内容少了很多。

初始安装

在你开始之前,请确保你已经安装了 Java 1.8(或更高版本)的 SDK 以及一个 Git 客户端。完成了?太棒了!接下来,切换到 Github 上的主分支:

git clone https://github.com/ilscipio/scipio-erp.git
cd scipio-erp
git checkout master

要安装该系统,只需要运行 ./install.sh 并从命令行中选择任一选项。在开发过程中,最好一直使用 “installation for development”(选项 1),它还将安装一系列演示数据。对于专业安装,你可以修改初始配置数据(“种子数据”),以便自动为你设置公司和目录数据。默认情况下,系统将使用内部数据库运行,但是它也可以配置使用各种关系数据库,比如 PostgreSQL 和 MariaDB 等。

 title=

按照安装向导完成初始配置

通过命令 ./start.sh 启动系统然后打开链接 https://localhost:8443/setup/ 完成配置。如果你安装了演示数据, 你可以使用用户名 admin 和密码 scipio 进行登录。在安装向导中,你可以设置公司简介、会计、仓库、产品目录、在线商店和额外的用户配置信息。暂时在产品商店配置界面上跳过网站实体的配置。系统允许你使用不同的底层代码运行多个在线商店;除非你想这样做,一直选择默认值是最简单的。

祝贺你,你刚刚安装了 Scipio ERP!在界面上操作一两分钟,感受一下它的功能。

捷径

在你进入自定义之前,这里有一些方便的命令可以帮助你:

  • 创建一个 shop-override:./ant create-component-shop-override
  • 创建一个新组件:./ant create-component
  • 创建一个新主题组件:./ant create-theme
  • 创建管理员用户:./ant create-admin-user-login
  • 各种其他实用功能:./ant -p
  • 用于安装和更新插件的实用程序:./git-addons help

另外,请记下以下位置:

  • 将 Scipio 作为服务运行的脚本:/tools/scripts/
  • 日志输出目录:/runtime/logs
  • 管理应用程序:<https://localhost:8443/admin/>
  • 电子商务应用程序:<https://localhost:8443/shop/>

最后,Scipio ERP 在以下五个主要目录中构建了所有代码:

  • framework: 框架相关的源,应用程序服务器,通用界面和配置
  • applications: 核心应用程序
  • addons: 第三方扩展
  • themes: 修改界面外观
  • hot-deploy: 你自己的组件

除了一些配置,你将在 hot-deploythemes 目录中进行开发。

在线商店定制

要真正使系统成为你自己的系统,请开始考虑使用组件。组件是一种模块化方法,可以覆盖、扩展和添加到系统中。你可以将组件视为独立 Web 模块,可以捕获有关数据库(实体)、功能(服务)、界面(视图)、事件和操作和 Web 应用程序等的信息。由于组件功能,你可以添加自己的代码,同时保持与原始源兼容。

运行命令 ./ant create-component-shop-override 并按照步骤创建你的在线商店组件。该操作将会在 hot-deploy 目录内创建一个新目录,该目录将扩展并覆盖原始的电子商务应用程序。

 title=

一个典型的组件目录结构。

你的组件将具有以下目录结构:

  • config: 配置
  • data: 种子数据
  • entitydef: 数据库表定义
  • script: Groovy 脚本的位置
  • servicedef: 服务定义
  • src: Java 类
  • webapp: 你的 web 应用程序
  • widget: 界面定义

此外,ivy.xml 文件允许你将 Maven 库添加到构建过程中,ofbiz-component.xml 文件定义整个组件和 Web 应用程序结构。除了一些在当前目录所能够看到的,你还可以在 Web 应用程序的 WEB-INF 目录中找到 controller.xml 文件。这允许你定义请求实体并将它们连接到事件和界面。仅对于界面来说,你还可以使用内置的 CMS 功能,但优先要坚持使用核心机制。在引入更改之前,请熟悉 /applications/shop/

添加自定义界面

还记得模板工具包吗?你会发现它在每个界面都有使用到。你可以将其视为一组易于学习的宏,它用来构建所有内容。下面是一个例子:

<@section title="Title">
    <@heading id="slider">Slider</@heading>
    <@row>
        <@cell columns=6>
            <@slider id="" class="" controls=true indicator=true>
                <@slide link="#" image="https://placehold.it/800x300">Just some content…</@slide>
                <@slide title="This is a title" link="#" image="https://placehold.it/800x300"></@slide>
            </@slider>
        </@cell>
        <@cell columns=6>Second column</@cell>
    </@row>
</@section>

不是很难,对吧?同时,主题包含 HTML 定义和样式。这将权力交给你的前端开发人员,他们可以定义每个宏的输出,并坚持使用自己的构建工具进行开发。

我们快点试试吧。首先,在你自己的在线商店上定义一个请求。你将修改此代码。一个内置的 CMS 系统也可以通过 https://localhost:8443/cms/ 进行访问,它允许你以更有效的方式创建新模板和界面。它与模板工具包完全兼容,并附带可根据你的喜好采用的示例模板。但是既然我们试图在这里理解系统,那么首先让我们采用更复杂的方法。

打开你商店 webapp 目录中的 controller.xml 文件。控制器会跟踪请求事件并相应地执行操作。下面的操作将会在 /shop/test 下创建一个新的请求:

<!-- Request Mappings -->
<request-map uri="test">
     <security https="true" auth="false"/>
      <response name="success" type="view" value="test"/>
</request-map>

你可以定义多个响应,如果需要,可以在请求中使用事件或服务调用来确定你可能要使用的响应。我选择了“视图”类型的响应。视图是渲染的响应;其他类型是请求重定向、转发等。系统附带各种渲染器,可让你稍后确定输出;为此,请添加以下内容:

<!-- View Mappings -->
<view-map name="test" type="screen" page="component://mycomponent/widget/CommonScreens.xml#test"/>

用你自己的组件名称替换 my-component。然后,你可以通过在 widget/CommonScreens.xml 文件的标签内添加以下内容来定义你的第一个界面:

<screen name="test">
        <section>
            <actions>
            </actions>
            <widgets>
                <decorator-screen name="CommonShopAppDecorator" location="component://shop/widget/CommonScreens.xml">
                    <decorator-section name="body">
                        <platform-specific><html><html-template location="component://mycomponent/webapp/mycomponent/test/test.ftl"/></html></platform-specific>
                    </decorator-section>
                </decorator-screen>
            </widgets>
        </section>
    </screen>

商店界面实际上非常模块化,由多个元素组成(小部件、动作和装饰器)。为简单起见,请暂时保留原样,并通过添加第一个模板工具包文件来完成新网页。为此,创建一个新的 webapp/mycomponent/test/test.ftl 文件并添加以下内容:

<@alert type="info">Success!</@alert>

 title=

一个自定义的界面。

打开 https://localhost:8443/shop/control/test/ 并惊叹于你自己的成就。

自定义主题

通过创建自己的主题来修改商店的界面外观。所有主题都可以作为组件在 themes 文件夹中找到。运行命令 ./ant create-theme 来创建你自己的主题。

 title=

一个典型的主题组件布局。

以下是最重要的目录和文件列表:

  • 主题配置:data/*ThemeData.xml
  • 特定主题封装的 HTML:includes/*.ftl
  • 模板工具包 HTML 定义:includes/themeTemplate.ftl
  • CSS 类定义:includes/themeStyles.ftl
  • CSS 框架: webapp/theme-title/

快速浏览工具包中的 Metro 主题;它使用 Foundation CSS 框架并且充分利用了这个框架。然后,然后,在新构建的 webapp/theme-title 目录中设置自己的主题并开始开发。Foundation-shop 主题是一个非常简单的特定于商店的主题实现,你可以将其用作你自己工作的基础。

瞧!你已经建立了自己的在线商店,准备个性化定制吧!

 title=

一个搭建完成的基于 Scipio ERP的在线商店。

接下来是什么?

Scipio ERP 是一个功能强大的框架,可简化复杂的电子商务应用程序的开发。为了更完整的理解,请查看项目文档,尝试在线演示,或者加入社区.


via: https://opensource.com/article/19/1/scipio-erp

作者:Paul Piper 选题:lujun9972 译者:laingke 校对:wxy

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