标签: brace-expansion

如何方便地为多个目录创建多个符号链接

lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v122 -> /home/files/video122
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v123 -> /home/files/video123
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v124 -> /home/files/video124
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v125 -> /home/files/video125
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v126 -> /home/files/video126
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v127 -> /home/files/video127
lrwxrwxrwx  1 deploy users    20  1? 23 18:15 v128 -> /home/files/video128
lrwxrwxrwx  1 deploy …
Run Code Online (Sandbox Code Playgroud)

bash symlink brace-expansion

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

如何在没有组合爆炸的情况下进行多个大括号扩展?

我经常在命令行上使用大括号扩展,因为它很方便。

例子

{foo,bar}
Run Code Online (Sandbox Code Playgroud)

扩展为:

foo bar
Run Code Online (Sandbox Code Playgroud)

多大括号扩展也扩展,例如:

{foo,bar}Q{foo,bar}
Run Code Online (Sandbox Code Playgroud)

将扩展为:

fooQfoo fooQbar barQfoo barQbar
Run Code Online (Sandbox Code Playgroud)

这是预期的行为,其中大括号扩展按顺序使用。

我的问题

现在,我希望任何大括号扩展(或其他简短的命令行技巧)的输出为:

fooQfoo barQbar
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用 bash 3.2

command-line bash brace-expansion

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

在 shell 中为 $* 的每个元素添加一个字符串

我正在寻找最简单的解决方案,将其$*作为输入,并扩展到以给定字符串为前缀和后缀的每个元素:

$*=foo bar baz
<solution(x,y)>=xfooy xbary xbazy
Run Code Online (Sandbox Code Playgroud)

我可以进行前置或附加,但不能同时进行:

echo ${*/#/x}
# prints xfoo xbar xbaz
Run Code Online (Sandbox Code Playgroud)
echo ${*/%/y}
# prints fooy bary bazy
Run Code Online (Sandbox Code Playgroud)

我无法结合这两种解决方案。该文档声称在 parameter=* 情况下扩展返回的值是一个列表,但我无法这样使用它。我想将生成的值数组作为单独的参数传递给另一个命令,因此简单地构建单个字符串是行不通的。

shell brace-expansion

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

括号扩展不适用于少于 2 个参数

我期待大括号扩展适用于任意数量的参数。但是,对于 n=1,我得到以下信息:

$ find models/nsf-projects-{7}*
models/nsf-projects-{7}.rdf
Run Code Online (Sandbox Code Playgroud)

对于 n>1 扩展按预期发生,例如:

$ find models/nsf-projects-{6,7}*
find: ‘models/nsf-projects-6*’: No such file or directory
find: ‘models/nsf-projects-7*’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我已经稍微浏览了 GNU 手册,但没有发现在任何地方明确声明 >1 个参数的要求。

问:n>1 确实是大括号扩展的要求吗?如果是这样,它为什么有用?

bash brace-expansion

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

在循环中创建带有大括号扩展的数组

我想生成一些仅按年份不同的数组。在循环中,我创建了带有大括号扩展和变量的数组。

我尝试了以下代码但没有成功:

LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
  declare -a 'y$year=('"$LIST"'-$year)'
  echo "${y$year[@]}"
done
Run Code Online (Sandbox Code Playgroud)

结果应该是以下条目的列表:

y1998: JF-1998 JFE-1998 RFS-1998 JBF-1998 JFI-1998 JMCB-1998
y1999: JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
...
y2011: JF-2011 JFE-2011 RFS-2011 JBF-2011 JFI-2011 JMCB-2011
Run Code Online (Sandbox Code Playgroud)

我不需要打印它们,只需在循环中使用它们并将它们作为参数传递即可。因为第二,eval在循环中是不够的。

array shell-script brace-expansion

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

大括号扩展在脚本中不起作用

for i in {1..40}
do 
   echo $i
done
Run Code Online (Sandbox Code Playgroud)

我有

{1..40}
Run Code Online (Sandbox Code Playgroud)

我想要一些类似的东西

1
2
3
and so on
Run Code Online (Sandbox Code Playgroud)

所以我可以i在命令的参数中使用变量。

shell bash shell-script brace-expansion

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

删除重复的 Bash 支撑扩展

如果匹配中存在重叠,大括号扩展可以产生文件名的多个实例。

一个简单的例子:

mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*
Run Code Online (Sandbox Code Playgroud)

这是一个非常简化的示例,仅用于说明。在这种情况下,单个文件abcd将被处理(或列出)两次。

如何才能最好地消除此列表的重复数据?

  • 可以使用关联数组。
  • 可以使用精心设计的 glob/brace 扩展,但这并不健壮。

bash wildcards brace-expansion

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

bash 内嵌大括号扩展

bash/readline 是否有一个绑定或一个可以绑定组合键以扩展内嵌大括号的函数?类似于M-* key组合方式可用于内联通配扩展。

所以在执行组合键时

$ {a..z}

将变成:

$ a b c d e f g h i j k l m n o p q r s t u v w x y z

bash readline brace-expansion

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

rsync:如何排除多种文件类型?

这是运行 Catalina 的 Mac 上的 bash:

这有效:

rsync -Pa --rsh="ssh -p 19991" --exclude '*.jpg' --exclude '*.mp4' pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Run Code Online (Sandbox Code Playgroud)

这些不:

rsync -Pa --rsh="ssh -p 19991" --exclude={'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/

rsync -Pa --rsh="ssh -p 19991" --exclude {'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Run Code Online (Sandbox Code Playgroud)

这是输出:

building file list ...
rsync: link_stat "/Users/mnewman/*.mp4}" failed: No such file or directory (2)
rsync: link_stat "/Users/mnewman/pi@localhost:/home/pi/webcam" failed: No such file or directory (2)
0 files to consider
sent 29 bytes  received 20 bytes  98.00 bytes/sec
total size …
Run Code Online (Sandbox Code Playgroud)

bash rsync brace-expansion

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

使用大括号扩展将扩展数组存储在变量中

我想存储node1 node2 node3在一个变量中,以便它可以用作其他脚本的输入。

但是,我想通过使用 bash 给出的大括号扩展来做到这一点,如下所示:node{1..3}

我尝试使用一个变量nodes=node{1..3},但是当我将它用作脚本的参数 ( $nodes) 时,它会按字面意思拾取并且不会扩展。

bash array brace-expansion

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