2013-12-16 120 views
1

我在UNIX命令 一个要求,在那里我有一个类似的路径:删除路径前缀

path/to/file/manyfiles.extensions 

现在我想TO-相似输出的东西

file/manyfiles.extensions 

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

但我可能只得到“/路径/到”作为我的输入,我必须从一个命令中删除树。

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

如 - `源文件 - 目标/班/

删除前缀 - target`

结果:

classes/my/code/HelloWorld.class 
classes/my/code/HelloWorldImpl.class 
classes/my/code/Main.class 
+1

你的问题不是很清楚。你可以尝试用一些例子清楚地再次解释它。 – anubhava

+0

让我更简单 - 假设你有这样的地址 - folder2/folder3/folder4/folder5/folder6/folder7/file.txt 现在这个结构需要太多时间来处理我的工作 我想要结构被修剪到这样的东西 folder6/folder7/file.txt – Rahul

+0

所以你想最后2个子文件夹和文件名到底? – anubhava

回答

1

你要的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}" 
5

如果我正确理解你的问题,你想去掉的路径上某个给定的前缀。给定一个声明path=/a/path/to/a/directory和图案*a/可以剥去前缀匹配以两种方式中击该图案:

​​

第一变体是非贪婪和在第一个匹配停止,而第二个是贪婪和停止在模式的最长匹配。 *a/模式在这里出现两次,所以结果会不同。

在你的情况的格局会像path/to和路径path/to/file/manyfiles.extensions,所以下面的人会工作,这取决于你是否需要贪婪与否:

path=path/to/file/manyfiles.extensions 
path=${path#*path/to/} # assigns "file/manyfiles.extensions" to $path 

path=path/to/file/manyfiles.extensions 
path=${path##*path/to/} # assigns "file/manyfiles.extensions" to $path 

仅供参考,请阅读Bash parameter expansion

1

您可以尝试grep -oP

p="older2/folder3/folder4/folder5/folder6/folder7/file.txt" 
s=$(grep -oP '([^/]+/){2}[^/]+/?$' <<< "$p") 
echo "$s" 

OUTPUT:

folder6/folder7/file.txt