从unix树中删除路径前缀

Rah*_*hul 2 unix bash shell terminal command

我在UNIX命令中有一个要求,我有一个类似于此的路径:

path/to/file/manyfiles.extensions
Run Code Online (Sandbox Code Playgroud)

现在我想要输出类似于 -

file/manyfiles.extensions
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做列出/ path/to和/ path逐个删除它们.

但我可能只得到"/ path/to"作为我的输入,我必须在一个命令中从树中删除它们.

您可能认为我可以列出要删除的2个文件夹,但在很多情况下我得到的结构有12-13个子文件夹,在许多情况下我只需要第一个和最后一个文件夹.

例如 - `源文件 - 目标/类/

删除前缀 - 目标`

结果:

classes/my/code/HelloWorld.class
classes/my/code/HelloWorldImpl.class
classes/my/code/Main.class
Run Code Online (Sandbox Code Playgroud)

小智 8

如果我正确理解您的问题,您想要删除路径上的某个给定前缀.给定声明path=/a/path/to/a/directory和模式,*a/您可以在Bash中以两种方式剥离匹配该模式的前缀:

echo ${path#*a/}    # outputs "path/to/a/directory"
echo ${path##*a/}   # outputs "directory"
Run Code Online (Sandbox Code Playgroud)

第一个变体是非贪婪的并且在第一个匹配时停止,而第二个变体是贪婪的并且在模式的最长可能匹配处停止.这里的模式*a/在out路径中出现两次,因此结果是不同的.

在你的情况下,模式将是path/to和路径一样path/to/file/manyfiles.extensions,所以下面的一个将起作用,这取决于你是否需要贪婪:

path=path/to/file/manyfiles.extensions
path=${path#*path/to/}   # assigns "file/manyfiles.extensions" to $path
Run Code Online (Sandbox Code Playgroud)

要么

path=path/to/file/manyfiles.extensions
path=${path##*path/to/}  # assigns "file/manyfiles.extensions" to $path
Run Code Online (Sandbox Code Playgroud)

供参考,请阅读Bash参数扩展.


Don*_*van 2

您需要使用该basename命令从文件名中删除目录,并结合dirname仅提供目录结构的命令。

然后,您可以使用所需的任何逻辑来获取需要保留的目录部分,并将其与文件名放回一起。

类似于这个伪代码:

original_file='/some/long/path/to/a/file'
file_name=$(basename $original_file)
dir_name=$(dirname $original_file)

short_dir='...use regex or whatever logic you need to pear ${dir_name} down (we'll need more info to help with this)'

new_file="${short_dir}/${file_name}"
Run Code Online (Sandbox Code Playgroud)