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参数扩展.
您需要使用该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)
| 归档时间: |
|
| 查看次数: |
5414 次 |
| 最近记录: |