Bash 在路径名扩展产生的每个单词前加前缀
我想模仿我在fish shell中的一些功能 假设我有这样的结构:Bash 在路径名扩展产生的每个单词前加前缀,bash,Bash,我想模仿我在fish shell中的一些功能 假设我有这样的结构: ❯ tree . └── a ├── 1.txt ├── 2.txt └── 3.txt 我想去掉目录a和前缀b更一般地说,我需要将路径a映射到路径b 在鱼方面,我只是: ❯ echo b/(basename a/*.txt) b/1.txt b/2.txt b/3.txt 但是bash中的相同技巧只在第一个元素前面加上前缀 $echo b/$(basename a/*.txt) b/1.tx
❯ tree
.
└── a
├── 1.txt
├── 2.txt
└── 3.txt
我想去掉目录a和前缀b更一般地说,我需要将路径a映射到路径b
在鱼方面,我只是:
❯ echo b/(basename a/*.txt)
b/1.txt b/2.txt b/3.txt
但是bash中的相同技巧只在第一个元素前面加上前缀
$echo b/$(basename a/*.txt)
b/1.txt 2.txt 3.txt
有什么好处?如何以一种良好的方式模拟此行为,在bash或sh中最好地不使用循环?在bash中,您可以从glob创建一个数组:
$ files=(a/*.txt)
$ declare -p files
declare -a files=([0]="a/1.txt" [1]="a/2.txt" [2]="a/3.txt")
然后使用将贪婪地匹配*/的每个前缀替换为b/:
扩展是${parameter/pattern/string}扩展的一种情况,其中参数是应用于每个数组元素的文件[@],模式以参数扩展值开头的匹配开始。由于元素之间用/分隔,因此模式和替换中的斜杠必须转义。在Bash中,您可以从glob创建数组:
$ files=(a/*.txt)
$ declare -p files
declare -a files=([0]="a/1.txt" [1]="a/2.txt" [2]="a/3.txt")
然后使用将贪婪地匹配*/的每个前缀替换为b/:
扩展是${parameter/pattern/string}扩展的一种情况,其中参数是应用于每个数组元素的文件[@],模式以参数扩展值开头的匹配开始。因为元素之间用/分隔,所以模式和替换中的斜杠必须转义。用printf代替echo怎么样
printf "b/%s " $( basename -a a/*.txt )
用printf代替echo怎么样
printf "b/%s " $( basename -a a/*.txt )
在fish中,命令输出返回的不是单个字符串,而是行列表。在fish中,在列表前面加上字符串将前缀应用于每个列表元素。如您所见,bash不是这样工作的。在fish中,命令输出返回的不是单个字符串,而是行列表。在fish中,在列表前面加上字符串将前缀应用于每个列表元素。正如你所看到的,bash并不是这样工作的。与我的胡言乱语不同,在文件名上使用空格和glob字符进行中断@本杰明。您忘记了达到命令长度限制。问题仍然比胡言乱语少。如果文件太多,这也可能达到命令长度限制。你的观点是什么?实际上echo只是一个例子,我需要将它作为参数传递给命令,例如../binary b/basename a/*.txt。@LeśnyRumcajs然后你可以使用find+xargs组合。将空分隔字符串列表抽入xargs似乎是就地构建奇特参数列表的常用方法。找到path./a/*.txt-printf./b/%f\0 | xargs-0./binaryBreaks在带有空格和全局字符的文件名上,这与我的胡言乱语不同@本杰明。您忘记了达到命令长度限制。问题仍然比胡言乱语少。如果文件太多,这也可能达到命令长度限制。你的观点是什么?实际上echo只是一个例子,我需要将它作为参数传递给命令,例如../binary b/basename a/*.txt。@LeśnyRumcajs然后你可以使用find+xargs组合。将空分隔字符串列表抽入xargs似乎是就地构建奇特参数列表的常用方法。找到path./a/*.txt-printf./b/%f\0 | xargs-0./b奇怪的是,有人在没有解释错误的情况下否决了这一点。这正是OP所要求的,一点也不优雅。但我想再好不过了。谢谢。奇怪的是,有人在没有解释问题的情况下否决了这一点。这正是OP所要求的,一点也不优雅。但我想再好不过了。非常感谢。