【问题标题】:Remove path prefix from unix tree从 Unix 树中删除路径前缀
【发布时间】:2014-01-04 00:50:09
【问题描述】:

我对 UNIX 命令有要求 我有类似这样的路径:

path/to/file/manyfiles.extensions

现在我想要输出类似于-

file/manyfiles.extensions

现在我可以列出 /path/to 和 /path 一个一个地删除它们。

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

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

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

移除前缀 - 目标`

结果:

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

【问题讨论】:

  • 你的问题不是很清楚。你能试着用一些例子再清楚地解释一下吗?
  • 让我让它更简单一些 - 假设你有一个这样的地址 - folder2/folder3/folder4/folder5/folder6/folder7/file.txt 现在这个结构需要太多时间来处理我的工作我希望将结构修剪成这样的文件夹6/folder7/file.txt
  • 那么你想要最后2个子文件夹和文件名吗?
  • 在下面发布了答案。

标签: bash shell unix terminal command


【解决方案1】:

你可以试试grep -oP:

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

输出:

folder6/folder7/file.txt

【讨论】:

    【解决方案2】:

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

    echo ${path#*a/}    # outputs "path/to/a/directory"
    echo ${path##*a/}   # outputs "directory"
    

    第一个变体是非贪婪的,在第一次匹配时停止,而第二个变体是贪婪的,在模式的最长匹配时停止。模式*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

    【讨论】:

      【解决方案3】:

      您需要使用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}"
      

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        • 2022-11-01
        • 2020-04-16
        • 1970-01-01
        相关资源
        最近更新 更多