在查看我的系统上的man页面ls并搜索 Google 之后,我发现有一种方法可以使用awk或perl在使用时显示八进制权限ls,但是bash还有什么更原生的吗?
$ ll
total 0
drwxr-xr-x 5 user group 170B May 20 20:03 .
drwxr-xr-x 17 user group 578B May 20 20:03 ..
-rw-r--r-- 1 user group 0B May 20 20:03 example
-rw-r--r-- 1 user group 0B May 20 20:03 example-1
-rw-r--r-- 1 user group 0B May 20 20:03 example-3
Run Code Online (Sandbox Code Playgroud)
$ ll
total 0
drwxr-xr-x 1775 5 user group 170B …Run Code Online (Sandbox Code Playgroud) $ touch dir/{{1..8},{a..p}}
$ tar cJvf file.tar.xz dir/
dir/
dir/o
dir/k
dir/b
dir/3
dir/1
dir/i
dir/7
dir/4
dir/e
dir/a
dir/g
dir/2
dir/d
dir/5
dir/8
dir/c
dir/n
dir/f
dir/h
dir/6
dir/l
dir/m
dir/j
dir/p
Run Code Online (Sandbox Code Playgroud)
我原以为它是按字母顺序排列的。但显然不是。这里的公式是什么?
通过阅读 GNU coreutils 手册页rm,其中一个选项是-f,根据手册,
-f, --force
ignore nonexistent files and arguments, never prompt
Run Code Online (Sandbox Code Playgroud)
现在,我做了一些测试并证明如果我使用类似的东西
rm -f /nonexisting/directory/
Run Code Online (Sandbox Code Playgroud)
它不会抱怨。
人们可以从这样的选择中真正获得什么?
另外,使用“删除目录”的最常见示例rm类似于
rm -rf /delete/this/dir
Run Code Online (Sandbox Code Playgroud)
这个-r选项是有道理的,但是-f?
我cut今天用的时候发现它不把一个UTF-8字符当作一个字符,而是把3个字符当作一个字符来对待,因为它有3个字节长。
对于许多工具来说,这似乎通常是正确的。
是否有支持coreutilsUTF-8 的版本?
我的locale输出:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
这是cut不起作用的时候
echo ?? | cut -c 2-
???
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是
?
Run Code Online (Sandbox Code Playgroud)
如果cut -c使用多字节字符。
需要帮助 - 在 GNU/LINUX bash 上的 shell 脚本上下文中:
我总是使用set -e. 通常,grep如果grep退出状态1指示未找到模式,我希望并且不总是希望脚本终止执行。
我试图解决这个问题的方法如下:
(尝试 I)
如果set +o pipefail并使用类似的东西调用 grepgrep 'p' | wc -l那么我会得到所需的行为,直到未来的维护者启用pipefail. 另外,我喜欢启用pipefail所以这对我不起作用。
(试二)
使用一个sed或awk和只打印匹配模式的行,然后wc匹配的行来测试匹配的模式。我不喜欢这个选项,因为使用sedtogrep似乎是解决我真正问题的方法。
(尝试 III)
这是我最不喜欢的 - 类似于:set +e; grep 'p'; set-e
任何见解/习语将不胜感激 - 谢谢。
使用 coreutils sort,如何按十六进制值(字段)进行数字排序?我期待着类似的东西
sort -k3,3x file_to_sort
Run Code Online (Sandbox Code Playgroud)
然而,这样的x情况并不存在。
编辑:到目前为止我想出的最佳解决方案是:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
Run Code Online (Sandbox Code Playgroud)
其中cut -d' ' -f3隔离搜索字段(这是-k3,3-这可能会有所不同,当然),和bc不转换为十进制(需要大写十六进制,没有0x前缀,匹配我的情况)。然后我加入、排序和拆分列。
最小样本输入:
5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7
Run Code Online (Sandbox Code Playgroud)
预期输出(按hex第三列排序的文件):
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh …Run Code Online (Sandbox Code Playgroud) tee可以将管道标准输入重定向到标准输出和文件。
echo Hello, World! | tee greeting.txt
Run Code Online (Sandbox Code Playgroud)
上面的命令将在终端屏幕上显示问候语并将其保存在greeting.txt文件的内容中,如果没有该名称的文件,则创建该文件。
还有-a用于tee附加到现有文件而不是覆盖的开关。
是否有一种方便的方法将管道输入重定向到命令和标准输出而不是文件?
我正在尝试创建一个包装脚本,buku以便将其索引号指定的书签的 URL 复制到主要选择。
# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION
Run Code Online (Sandbox Code Playgroud)
这里我用了echo 两个两次,第一次是在终端上显示,然后是保存在主选区(剪贴板)中。
我想象echo $url | teeC xsel在传递给下一个命令(链接命令)之前显示输出的某些东西或快捷方式,什么可以让我将整个命令链接在一行中,而无需将结果保存在变量中,如下所示:
buku -f 1 -p $1 | cut -f 2 | teeC xsel
Run Code Online (Sandbox Code Playgroud)
我还可以使用它urlview …
我在回答另一个问题时注意到test和[是不同的二进制文件,但[联机帮助页会显示test's. 除了对结局的要求],还有什么区别吗?如果不是,为什么它们分开二进制文件而不是符号链接?(它们也是bash内置bash函数,也没有区别。)
我想要一种随机运行命令的方法,比如 10 次中的 1 次。是否有内置或 GNU coreutil 来执行此操作,理想情况下是这样的:
chance 10 && do_stuff
哪里do_stuff只执行了 10 次?我知道我可以写一个脚本,但这似乎是一件相当简单的事情,我想知道是否有一种定义的方式。
du当-L命令与命令行选项一起使用时,我注意到命令的奇怪行为。
我正在使用 Slackware 14 和 Coreutils 8.19。
要重现奇怪的行为,请创建两个文件夹:
mkdir foo
mkdir bar
Run Code Online (Sandbox Code Playgroud)
在其中一个文件夹中创建一个文件:
perl -e 'print "A"x10000' > foo/text
另一个文件夹中的符号链接:
ln -s ../foo/text bar/text
现在,如果你输入:
du -h -L bar
你会得到:
16k bar
由于符号链接被取消引用。但是如果你输入:
du -h -L *
你会得到:
16K foo
4.0K bar
Run Code Online (Sandbox Code Playgroud)
并且符号链接不会被取消引用。我错过了什么吗?