Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在路径名扩展产生的每个单词前加前缀_Bash - Fatal编程技术网

Bash 在路径名扩展产生的每个单词前加前缀

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

我想模仿我在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.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所要求的,一点也不优雅。但我想再好不过了。非常感谢。