小编Ray*_*ews的帖子

结合“du”和“tree”的精华

我想知道我们是否可以将“du”的诚实与“tree”的缩进格式结合起来。如果我想要目录大小的列表:

du -hx -d2
Run Code Online (Sandbox Code Playgroud)

...显示两层深,所有大小摘要都是真实的,但没有子目录的缩进。另一方面:

tree --du -shaC -L 2
Run Code Online (Sandbox Code Playgroud)

...缩进和着色很好,但报告的尺寸是谎言。要获得实际尺寸,必须:

tree --du -shaC
Run Code Online (Sandbox Code Playgroud)

...也就是说,如果您让“树”显示整个目录结构,您只能获得真实的大小。无论我想要实际显示多少级子目录,我都希望能够始终拥有正确大小的摘要。我经常这样做:

tree -du -shaC | grep "\[01;34m"
Run Code Online (Sandbox Code Playgroud)

...修剪除目录之外的所有内容,并很好地缩进它们......但是没有简单的方法可以将显示限制为给定的数字级别(不包括摘要)。有办法吗?也许我错过了正确的开关......

disk-usage tree

28
推荐指数
3
解决办法
3万
查看次数

键绑定表?

我们是否有一个键绑定表来翻译所有指代按键的方式?我正在使用zsh,但我认为如果有这样的表,它将适用于任何外壳。

我问的原因是我想分配一些键绑定,但我不知道如何引用它们(除非我要窃取一个已经定义的)。

例如,在“zbindkey”中,我们有这样的事情:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
Run Code Online (Sandbox Code Playgroud)

...我可以猜到“kend”意味着这是指End钥匙。

交叉检查bindkey我看到这些行:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line
Run Code Online (Sandbox Code Playgroud)

...所以我相信其中一行是指End密钥。哪一个?

我们在“bindkey”文件中也有这个:

bindkey "\e[A" history-beginning-search-backward
Run Code Online (Sandbox Code Playgroud)

现在,我碰巧知道那是Up Arrow关键,但如果我不知道,我怎么知道呢?

$ bindkey (at CLI)
Run Code Online (Sandbox Code Playgroud)

... 为同一个键提供了不同的语言:

"^[[A" history-beginning-search-backward
Run Code Online (Sandbox Code Playgroud)

...但至少现在我知道 ^[[A在 bindkey-at-CLI 中说话与\e[A在 bindkey-in-zbindkey 中说话是一样的。这很容易。在过去的DOS下,Up Arrow0;72-你会发现每一个法律按键的扫描码,有仅仅是一种语言。

有桌子吗?或者能够选择击键并知道如何terminfo[]在“bindkey-in-zbindkey”中……在“bindkey-at-CLI”和/或任何其他语言中引用它的其他方式碰巧是?

同样,在 DOS 中有scancode程序——键入一个键,你就得到了扫描码。这太容易了。


从答案中我猜想没有办法打印出所有可能绑定的表格?无论如何'bindkey'几乎可以满足我的要求:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey …
Run Code Online (Sandbox Code Playgroud)

zsh terminal keyboard key-mapping

24
推荐指数
4
解决办法
3万
查看次数

字符串替换:所有出现

一个简单的问题,但我找不到答案。zsh 文档让我不知所措:-(

function z ()
{
  echo ${1:s/the/THE}
}

$ z thethethe
THEthethe
Run Code Online (Sandbox Code Playgroud)

...

如何将所有“the”替换为“THE”,而不仅仅是第一次出现?使用 zsh,它是最简单的事情,但似乎最难找到示例。

zsh string

19
推荐指数
4
解决办法
2万
查看次数

知道分区需要编辑,可以使用“dd”克隆到较小的硬盘驱动器吗?

我曾经dd像这样克隆磁盘:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync
Run Code Online (Sandbox Code Playgroud)

而且它一直运行良好。'dd' 上的所有文档都煞费苦心地提醒您目标磁盘的大小必须与源磁盘相同或更大。这一定是真的吗?

现在,我很清楚,如果我克隆到一个较小的磁盘,我不能指望目标上任何部分 “越界”的分区都完好无损。

但是,完全知道我稍后需要在目标上编辑我的分区,删除“越界”的分区,我是否仍然可以使用“dd”来制作源的蛮力副本,直至达到极限目标的物理尺寸?或者,当目标达到其大小限制时,会“dd”将目标减少为一堆冒烟的残骸;-)

顺便说一句,在研究这个时,我已经看到bs=了从bs=1024到的所有内容的推荐值bs=32M,什么才是最好的?

partition dd cloning hard-disk

19
推荐指数
2
解决办法
5万
查看次数

为什么在 debian init 期间某些脚本需要不断重新采购?

研究 init 脚本后,我很困惑为什么需要一次又一次地重新获取某些辅助功能。特别是在/lib/lsb/init-functions. 每个需要日志消息的脚本都需要重新获取它的资源,为什么不能只做一次,仅此而已?

就好像每个新的 init 脚本都在它自己的 shell 中运行。如果是这样,为什么要那样做?同样的问题出现在“vars.sh”上,它需要一直重新获取资源。这是必要的吗?假设 'init-functions' 和 'vars.sh' 被添加到脚本列表中以在适当的运行级别中运行?

debian sysvinit

6
推荐指数
1
解决办法
269
查看次数

使用 sed 将 C 风格的注释转换为 C++ 风格

我正在尝试将单行“C”样式注释转换为“C++”样式。下面的“sed”还不错,但是如果任何前导代码(注释之前的代码)中包含任何“/”,它当然会失败:

sed -i 's,\(^[^\/]*\)\/\*\([^\*]*\)\*\/[ ]*$,\1\/\/\2,' filename
Run Code Online (Sandbox Code Playgroud)

我希望我能做的是:

... [^\\/\\*] ...
Run Code Online (Sandbox Code Playgroud)

即否定' /* '当然不起作用,但是经过几个小时的搜索,我找不到如何正确执行此操作的简单解释:(这似乎不应该是火箭科学。

例如,这些字符串:

blah blah        /* comment */
blah blah / blah /* comment */
blah blah        /* comment */ blah
blah blah / blah /* comment */ blah 
Run Code Online (Sandbox Code Playgroud)

...应该这样转换:

blah blah        // comment 
blah blah / blah // comment 
blah blah        /* comment */ blah  (this CAN'T be converted)
blah blah / blah /* comment */ blah  (this CAN'T be converted)
Run Code Online (Sandbox Code Playgroud)

...显然,如果在“C”注释之后有代码,则无法进行转换。

我将在文件前后进行密切的视觉比较,因此无需在文字中处理“ /* ”,也不想转换任何多行内容。

注意我认为这是一个“否定”问题,但也许还有另一种方法。我只需要在“ …

sed

6
推荐指数
1
解决办法
1511
查看次数

我们可以从一个安装的 linux 热交换到另一个吗?

我在我的机器上有几个单独的 Linux 安装,然后重新启动到任何一个合适的。我想知道是否可以通过执行某些操作(例如,复制 fstab 并列出新安装的分区,然后在不完全重新启动的情况下从一个切换到另一个)mount -a

显然,内核不会改变,但没关系,我希望只改变工作分区。我也很明显地认为这必须在没有任何运行的情况下从命令行完成(如果可能的话)。或者这个想法从一开始就是无效的和纯粹的疯狂?

这样做的原因是我通常在单独的“实验性”安装中尝试彻底的更改(例如在 Debian 中移动到“amd64”内核)。重新启动以启动它当然很好,但是如果我可以在不完全重新启动的情况下跳转到该安装,那就太酷了。您可以认为这只是动态更改根分区,但这可能根本不可能。

是的,这是可能的,正如我在下面了解到的。如果您不需要换出内核本身,请使用“chroot”。如果要模拟完全重启,请使用“kexec”。

linux

5
推荐指数
1
解决办法
2322
查看次数

当参数以斜杠开头时 dpkg -S 的行为

dpkg -S /usr/share/doc/tasksel-data  # fine  
dpkg -S  usr/share/doc/tasksel-data  # fine  
dpkg -S     /share/doc/tasksel-data  # not found  
dpkg -S      share/doc/tasksel-data  # fine  
dpkg -S        are/doc/tasksel       # fine  
Run Code Online (Sandbox Code Playgroud)

为什么上面的第三行会失败?请注意,第一行以斜杠( /)开头,因此这似乎不是问题所在。

dpkg

2
推荐指数
1
解决办法
97
查看次数

使用“sed”替换最多一个单词(而不是一个字符)的任何内容

我知道如何使用sedwith[^xxxx]语法来排除字符,但如何排除单词?例如我的变量:

var="
Now is the time
for all good men 
to come 
to the aid  
of the party" 
Run Code Online (Sandbox Code Playgroud)

现在:

echo $var | sed ...
Run Code Online (Sandbox Code Playgroud)

...我想最终得到:

REPLACED time
for all good men 
to come 
REPLACED aid  
REPLACED party 
Run Code Online (Sandbox Code Playgroud)

...这应该很简单,但我不知道该怎么做。

echo $var | sed -r 's/^[^the]*the/REPLACED/'
Run Code Online (Sandbox Code Playgroud)

... 有点接近,但它们t h e被匹配为单个字符,而不是单词the

如果有解决方案,我可以替换所有内容,直到多次出现的第一个,甚至直到一个特定的出现,那就更好了。

sed text-processing regular-expression

2
推荐指数
1
解决办法
1511
查看次数