小编jak*_*b.g的帖子

带有多个 `-name` 和 `-exec` 的 `find` 只执行 `-name` 的最后一个匹配项

当我使用

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

它找到所有类型的文件。但是当我-exec在最后添加时:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;

它似乎只打印.txt文件。我究竟做错了什么?

注意:使用 MINGW (Git Bash)

find

96
推荐指数
2
解决办法
10万
查看次数

删除包含特定字符串的行和以下行

我用这个

cat foo.txt | sed '/bar/d'

删除bar文件中包含字符串的行。

然而,我想删除这些行和它之后的行。最好的sedawk或者其他工具,在MINGW32的可用。

这是我可以grep使用-A-B打印匹配行以及匹配行之前/之后的行的一种相反。

有什么简单的方法可以实现吗?

sed awk text-processing replace

93
推荐指数
4
解决办法
23万
查看次数

如何使用cp以幂等方式递归复制文件夹?

当我使用

cp -R inputFolder outputFolder
Run Code Online (Sandbox Code Playgroud)

结果取决于上下文

  1. 如果outputFolder不存在,则创建,克隆的文件夹路径为outputFolder.
  2. 如果outputFolder存在,则创建的克隆将是outputFolder/inputFolder

这太可怕了,因为我想创建一些安装脚本,如果用户错误地运行了两次,他将outputFolder第一次创建,然后在第二次运行时所有的东西都将在outputFolder/inputFolder.

  • 我总是想要第一个行为:在原始(作为兄弟)旁边创建一个克隆。
  • 我想使用cp便携(例如 MINGW 没有rsync发货)
  • 我检查过,cp -R --parents但这会重新创建一直向上到目录树的路径(因此克隆不会outputFolder但是some/path/outputFolder
  • --remove-destination或者--update如果 2 不改变任何东西,仍然将东西复制到outputFolder/inputFolder

有没有办法在不首先检查outputFolder(如果文件夹不存在则......)或使用的情况下做到这一点rm -rf outputFolder

公认的、可移植的 UNIX 方式是什么?

cp recursive

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

创建可移植地指向脚本文件夹中的解释器的shebang

我有一个 JS 文件(file.js),我想通过 nodejs(实际上是 iojs)作为命令行 shell 脚本执行;我在 Windows 上使用 MINGW Git Bash。

标准的做法是将以下shebang放在JS文件中:

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

但是,我想将 cmd 行标志传递给节点以激活 V8 和声功能,即我想要一个等效的

node --harmony_arrow_functions file.js
Run Code Online (Sandbox Code Playgroud)

当运行时

./file.js
Run Code Online (Sandbox Code Playgroud)

无需手动传递标志。

使用

#!/usr/bin/env node --harmony_arrow_functions
Run Code Online (Sandbox Code Playgroud)

不起作用。

在考虑了/sf/answers/567627931//sf/answers/401498331/之后,我创建了以下解决方案:

$ ls
file.js nodeharmony.sh

$ cat nodeharmony.sh
#!/bin/sh
exec node --harmony_arrow_functions "$@"

$ cat file.js
#!/bin/sh nodeharmony.sh               # or ./nodeharmony.sh, doesn't matter
console.log("Hello world")

$ ./file.js    # this works fine
Hello world
Run Code Online (Sandbox Code Playgroud)

但问题是,当我从另一个文件夹执行它时,shell 会尝试nodeharmony.sh在当前工作目录中查找,而不是在以下目录中查找file.js

$ cd ..
$ …
Run Code Online (Sandbox Code Playgroud)

shell-script shebang

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

匹配相距至少 N 行的两条不同的行

我想匹配包含try(在一行中)和连续catch(在另一行中)至少 N 行之后的文件(以找到很长的尝试捕获并尝试摆脱它们)。我的意思是,第一个 catch之后try应该是 N 行之后。

是否有使用标准 UNIX 工具(例如grep, sed, )来执行此操作的好方法awk

我尝试了两次,grep -A <number> -B <number>但它擅长相反的事情,即找到不超过 N 行的 try-catch。

grep sed awk

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

使用 `$1` 和后备默认值的别名打印参数和后备值

我想创建一个可以处理参数 ( $1)的别名,如果没有提供参数,可以回退到默认值。例如,

$ alias foo='NUM=${1:-42}; echo $NUM'
Run Code Online (Sandbox Code Playgroud)

在没有参数的情况下调用它可以按我的意愿工作:

$ foo
42
Run Code Online (Sandbox Code Playgroud)

但是使用参数调用时,它会打印我的值和默认值:

$ foo 69
42 69
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样。应该如何正确操作?我怎样才能自己调试这种问题?

shell debugging alias troubleshooting

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