我试图/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)
我已经测试了很多方法,但我不能/在字符串前面包含。
使用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不影响结果。
START在由模式和标记的部分前后有任何乱码文本的文件中END(每个特定字符串仅出现一次,并且以正确的顺序出现在同一行上)。我只想对START和之间的部分进行一些字符串操作END
输入示例:
\naomodi3hriq32| \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\nRun Code Online (Sandbox Code Playgroud)\n就 - 操作而言,和sed之间的子字符串(并且仅是子字符串)应该像我使用 一样进行修改。STARTENDsed 's/_this_// ; s/modi/MODI/ ; y/as/45/'
输出示例:
\naomodi3hriq32| \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\nRun Code Online (Sandbox Code Playgroud)\nawkwithFS="START|END"失败,因为OFS不能在不同位置设置多个值。
我尝试使用sed嵌套命令替换和不同的分隔符 ( ) 但失败了,并且还担心之前/之后~可能有字符会扰乱命令(例如 a )。我们的想法是仅选择“内部”子字符串并执行操作,然后将其用作替换的一部分:STARTEND/
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) 我有两个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) 当rsync荷兰国际集团的目录新鲜插入的外置USB闪存驱动器,通过
rsync -av /source/ /dest/
Run Code Online (Sandbox Code Playgroud)
尽管文件没有变化,但所有文件都被传输(即重写)。
请注意,只有在拔下并重新插入 USB 后才会覆盖文件。在做rsync连续命令两次没有拔下驱动器在两者之间确实成功地跳过了整个目录内容。
包括-u更新选项并显式添加该-t选项并没有改变任何东西。
的安装点保持不变(即/media/user/<UUID>,驱动器是由automoutedxfce时,/dev/sdxy明显改变)的硬盘驱动器是源ext4,而USB是vfat与utf8字符编码。
这种行为的原因可能是/dev/名称条目的更改?如何rsync在正确识别文件更改的情况下运行?如果没有这个,我的备份应该只需要几秒钟,而由于大量数据被反复覆盖,现在它总是几分钟,而且大量写入也不是闪存驱动器预期寿命的最佳选择。
其中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) 直接在命令行上,这有效:
$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=Xsed -e $(cat sed.script) file:适用于单行脚本,在多行脚本上失败,即使注释作为第一行sed -f <(cat script.sed) file …我在我的个人笔记本电脑和我的系统上使用 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)