前言
大雨哗哗哗,叫车无人接,把最近用到的命令总结一下,方便日后的拿来主义。
>/dev/null 2>&1
>/dev/null 2>&1 &
是一个常见的 Shell 命令行用法,用于在 Linux 或类 Unix 系统上运行一个程序并将其输出(标准输出和标准错误输出)重定向到 /dev/null
,同时将程序在后台(background)运行。
接下来可以逐步解释下各部分的作用:
>
:重定向符号,用于将输出重定向到指定的文件或设备。/dev/null
:在 Unix 系统上,/dev/null
是一个特殊的设备文件,它会将所有写入它的内容都丢弃,相当于一个空黑洞。将输出重定向到/dev/null
就意味着将输出丢弃,不会显示在终端或记录到文件中。2>
:重定向标准错误输出的符号。2
表示标准错误流,也称为文件描述符 2。&1
:将标准错误输出重定向到标准输出的符号。&1
表示文件描述符 1,而标准输出的文件描述符也是 1。这样,就将标准错误输出和标准输出合并到一起,都重定向到了/dev/null
。&
:在命令行中,&
符号用于将命令置于后台运行,使得当前终端可以继续输入其他命令,而不需要等待前台命令的完成。
综合起来,>/dev/null 2>&1 &
的作用是将某个程序在后台运行,并将其标准输出和标准错误输出都丢弃,不在终端中显示或记录。这样做常常用于运行不需要显示输出的程序或脚本,并且让它在后台运行,不占用终端的输入输出。
去除文件夹下所有文本文件的行末空格
想要达到这个目的有多种实现方式,比如:
1 | find . -type f -exec egrep -l " +$" {} \; | grep -v xxx | xargs sed -i 's/[ ]*$//g' |
再比如:
1 | find xxx -type f -name "*.txt" -exec sed -i 's/[ \t]*$//' {} \; |
主要部分的含义:
-type f
:-type f
参数用于限制find
命令只查找普通文件(非目录、符号链接等)。-name "*.txt"
:-name "*.txt"
参数用于匹配文件名,这里匹配以.txt
结尾的文件。您可以根据实际需要修改为其他文件扩展名。-exec
:-exec
参数用于对找到的每个文件执行后面的命令。sed -i 's/[ \t]*$//' {}
:sed
命令用于进行文本替换。-i
参数表示直接在原文件上进行修改(in-place),而不是在终端输出。s/[ \t]*$//
是一个替换表达式,用于匹配行末的空格(包括空格和制表符),将其替换为空。{}
:find
命令中的占位符,代表找到的每个文件名。\;
:find
命令中的结束符,表示-exec
参数的结束。
还可以利用管道来实现,使用管道 (Pipeline) 去掉一个文件夹下所有文本文件行末的空格,可以结合 find
命令和 sed
命令来完成。管道允许将一个命令的输出作为另一个命令的输入,以实现更复杂的文本处理,如下:
1 | find xxx -type f -name "*.txt" -print0 | xargs -0 sed -i 's/[ \t]*$//' |
各部分的含义:
find xxx -type f -name "*.txt" -print0
:find
命令查找指定目录xxx
下的所有以.txt
结尾的文本文件,并使用-print0
参数将文件名以空字符作为分隔符打印出来。这是为了处理文件名中可能包含空格或特殊字符的情况。|
:管道符号,将find
命令的输出传递给下一个命令。xargs -0
:xargs
命令用于接收管道的输入,并将其作为参数传递给后面的命令。-0
参数表示使用空字符作为输入分隔符,与find
命令的-print0
参数相对应。sed -i 's/[ \t]*$//'
:sed
命令用于进行文本替换,同样使用-i
参数进行直接修改。s/[ \t]*$//
是一个替换表达式,用于去掉行末的空格。
与之前的命令相比,这个命令通过管道一次性处理了多个文件,效率可能会更高一些。
总结
- 将某个程序在后台运行,并将其标准输出和标准错误输出都丢弃,可以在运行命令后加
>/dev/null 2>&1
- 去除文件行末空格
find . -type f -exec egrep -l " +$" {} \; | grep -v xxx | xargs sed -i 's/[ ]*$//g'
机会很重要,选择也很重要,在机会面前做出选择同样很重要,不要过分夸大未选择的那条路,很多时候即使重新选择一次,大部分人的道路不会发生改变,已经定型了…
我也不知道是熬到了司机来,还是把前边排队的人熬走了,现在还有3人排队~
2023-8-1 01:47:54