小编Fel*_*xJN的帖子

在(本机 Solaris)查找命令中排除目录

我试图/zones在我的find命令中排除该目录。我没有 GNU find 可用,只有本机 Solaris find

我试过这样的事情:

find / -type d ! -name zones
Run Code Online (Sandbox Code Playgroud)

问题是,有了这个排除,我也会丢失像/etc/zones.

有没有办法指定完整的目录名称,如:

find / -type d ! -name ^\/zones
Run Code Online (Sandbox Code Playgroud)

我已经测试了很多方法,但我不能/在字符串前面包含。

solaris find

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

seq 十进制分隔符

使用seq带有浮点数的命令,我的输出带有逗号而不是点作为小数点分隔符,尽管在输入中使用了点:

seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
Run Code Online (Sandbox Code Playgroud)

我假设这与 locale 相关联LC_NUMERIC,它被设置为de_DE.UTF-8,但是更改为en_US.UTF-8并没有修复它,我使用相同语言环境设置的另一个系统确实返回点。即使通过 eg 明确定义格式-f %1.2也不返回点,而是返回逗号作为小数点分隔符。

我在哪里以及如何改变这种行为?如何确保我的脚本在任何给定系统上都不会出错?显然,如果不通过tr类似方式重新处理,任何输出都将无法用于进一步处理。

在德国时区使用英语安装 Mint,在另一台机器上使用 raspian。


编辑:locale给定机器上的设置:

“逗号”一:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

“点”一:

LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

设置LANGUAGE不影响结果。

terminal shell-script seq floating-point

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

仅对子字符串进行更改操作

START在由模式和标记的部分前后有任何乱码文本的文件中END(每个特定字符串仅出现一次,并且以正确的顺序出现在同一行上)。我只想对START和之间的部分进行一些字符串操作END

\n

输入示例:

\n
aomodi3hriq32| \xc2\xb6\xc2\xb3r 0q93aoiSTART_this_is_to_be_modified_ENDaqsdofuha23uru| \xc2\xb223i ii3uhfia\noawpo3<9"\xc2\xa7 A hSTART_this_also_needs_modification_ENDqa 032/a237(\xc2\xb01Q"\xc2\xa7 >A_this_\nSTART changeme ENDnot_this_modias\n
Run Code Online (Sandbox Code Playgroud)\n

就 - 操作而言,和sed之间的子字符串(并且仅是子字符串)应该像我使用 一样进行修改。STARTENDsed 's/_this_// ; s/modi/MODI/ ; y/as/45/'

\n

输出示例:

\n
aomodi3hriq32| \xc2\xb6\xc2\xb3r 0q93aoiSTARTi5_to_be_MODIfied_ENDaqsdofuha23uru| \xc2\xb223i ii3uhfia\noawpo3<9"\xc2\xa7 A hSTART4l5o_need5_MODIfic4tion_ENDqa 032/a237(\xc2\xb01Q"\xc2\xa7 >A_this_\nSTART ch4ngeme ENDnot_this_modias\n
Run Code Online (Sandbox Code Playgroud)\n

awkwithFS="START|END"失败,因为OFS不能在不同位置设置多个值。

\n

我尝试使用sed嵌套命令替换和不同的分隔符 ( ) 但失败了,并且还担心之前/之后~可能有字符会扰乱命令(例如 a )。我们的想法是仅选择“内部”子字符串并执行操作,然后将其用作替换的一部分:STARTEND/

\n
sed "s/^\\(.*\\)START.*END\\(.*\\)$/\\1$(sed 's~^.*START~~\n                                         s~END.*~~\n                                         s~_this_~~\n                                         s~modi~MODI~\n                                         y~as~45~' infile)\\2/" …
Run Code Online (Sandbox Code Playgroud)

sed awk perl text-processing

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

通过 BASH 数组来区分文件内容

我有两个bash数组,说:

arr1=( 1 2 3 )
arr2=( 1 2 A )
Run Code Online (Sandbox Code Playgroud)

我想使用diff. 我如何传递数组,就好像它们是文件的内容一样?

我尝试了一些变体,但都失败了:

diff -y <$( echo ${arr1[@]} | tr ' ' '\n' ) <$( echo ${arr2[@]} | tr ' ' '\n' )
diff -y <${arr1[@]} <${arr2[@]}
diff -y $(<${arr2[@]}) $(<${arr1[@]})
diff -y  <<<"$( echo ${arr1[@]} | tr ' ' '\n' )" \
         <<<"$( echo ${arr2[@]} | tr ' ' '\n' )"
Run Code Online (Sandbox Code Playgroud)

所需的输出将是预期的diff -y,如果我将数组存储到文件 a 和 b 中,我会得到:

diff a b
 1        1 …
Run Code Online (Sandbox Code Playgroud)

bash diff io-redirection array

4
推荐指数
1
解决办法
450
查看次数

rsync 到 USB 闪存驱动器始终传输所有数据

rsync荷兰国际集团的目录新鲜插入的外置USB闪存驱动器,通过

rsync -av /source/ /dest/
Run Code Online (Sandbox Code Playgroud)

尽管文件没有变化,但所有文件都被传输(即重写)。

请注意,只有在拔下并重新插入 USB 后才会覆盖文件。在做rsync连续命令两次没有拔下驱动器在两者之间确实成功地跳过了整个目录内容。

包括-u更新选项并显式添加该-t选项并没有改变任何东西。

的安装点保持不变(即/media/user/<UUID>,驱动器是由automoutedxfce时,/dev/sdxy明显改变)的硬盘驱动器是源ext4,而USB是vfatutf8字符编码。

这种行为的原因可能是/dev/名称条目的更改?如何rsync在正确识别文件更改的情况下运行?如果没有这个,我的备份应该只需要几秒钟,而由于大量数据被反复覆盖,现在它总是几分钟,而且大量写入也不是闪存驱动器预期寿命的最佳选择。

ext4 mount rsync vfat

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

了解后台变量分配和 wait 命令

其中man bash写道:

等待[-fn] [id ...]

等待每个指定的子进程并返回其终止状态。每个id可能是进程ID或作业规范;如果给出了作业规范,则等待该作业管道中的所有进程。如果未给出 id,则等待所有当前活动的子进程,并且返回状态为零。如果提供了 -n 选项,则 wait 等待任何作业终止并返回其退出状态。

典型的例子如

 command1 & command2 & command3 & wait
Run Code Online (Sandbox Code Playgroud)

意味着这三个命令并行运行,并且只有在所有命令完成后才会完成下一步。

我的问题在于这两个 bash 脚本的结果:

#!/bin/bash
for i in 1 2 3 ; do
  a=$i
  echo "$a is $i"
done 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

结果:

1 is 1
2 is 2
3 is 3
Run Code Online (Sandbox Code Playgroud)

和我预期的差不多。现在我假设分配变量是一个漫长的过程,所以我等待它:

#!/bin/bash
  for i in 1 2 3 ; do
  a=$i & wait
  echo "$a is $i"
done 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

结果是:

3 is 1
3 is 2
3 is 3 …
Run Code Online (Sandbox Code Playgroud)

bash shell-script

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

sed 与外部脚本文件 - 如何应用 shell 变量?

直接在命令行上,这有效:

$sed "s/a/X/;s/X/&a&/" file
Run Code Online (Sandbox Code Playgroud)

使用 shell 变量也是如此:

$varin=a ; varout=X ; sed "s/$varin/$varout/;s/$varout/&$varin&/" file
Run Code Online (Sandbox Code Playgroud)

但是使用外部脚本文件

$sed -f script.sed file
Run Code Online (Sandbox Code Playgroud)

只有“硬编码”方法才有效

$cat script.sed
s/a/X/
s/X/&a&/
Run Code Online (Sandbox Code Playgroud)

虽然 shell 变量没有扩展

$cat script.sed
s/$varin/$varout/
a/$varout/&$varin&/

$varin=a ; varout=X ; sed -f script.sed file
#-> variables in script.sed not interpreted; output unchanged
Run Code Online (Sandbox Code Playgroud)

如何实现外部脚本文件中shell变量的解释sed

我很明白它sed本身无法解释 shell 变量,但是我如何预处理脚本(以保存方式)以一次运行它来bash解析变量?sed也许人们可以在一开始就使用命令将它们导入?

以下方法没有成效(使用bash):

  • 使用export varin=a ; export varout=X
  • via sed -e $(cat sed.script) file:适用于单行脚本,在多行脚本上失败,即使注释作为第一行
  • sed -f <(cat script.sed) file …

scripting bash sed variable-substitution variable

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

rm 拒绝删除文件夹!(与 -R 选项无关)

我在我的个人笔记本电脑和我的系统上使用 Ubuntu,每当我使用rm文件时,它就消失了。好的。
问题出在我的大学服务器上。
我正在尝试从我的主目录中删除一个文件夹:environment/tests。令我大吃一惊的是,当我使用 rm environment/tests(出于某种奇怪的原因,rm 不需要 -R 选项来删除大学服务器上的文件夹...)时,这就是我得到的:

u2 **** 114 : rm environment/tests
/bin/mv: cannot move `environment/tests/' to `/u/stud/****/../TrashCan/****/tests': File exists
u2 **** 115 :
Run Code Online (Sandbox Code Playgroud)

(**** 代替我的用户名)

所以我试图将它从垃圾桶中删除,但意识到这是一个递归调用...... :)

u2 **** 157 : rm ~/../TrashCan/****/tests
/bin/mv: `/u/stud/****/../TrashCan/****/tests' and `/u/stud/****/../TrashCan/****/tests' are the same file
u2 **** 158 :
Run Code Online (Sandbox Code Playgroud)

首先,mv在这里有什么作用?(注意这是一个 /bin/mv 错误)
其次,我怎样才能一劳永逸地删除这个文件夹?
事实上,当我在做的时候,我想完全清空垃圾桶。但是,这个:

u2 **** 169 : rm * ~/../TrashCan/
Run Code Online (Sandbox Code Playgroud)

不起作用。
服务器运行以下版本:

u2 **** 170 : uname -a
Linux u2 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 …
Run Code Online (Sandbox Code Playgroud)

rm

0
推荐指数
1
解决办法
4784
查看次数