【问题标题】:Find Files That Contain Exactly Two Forward Slashes查找正好包含两个正斜杠的文件
【发布时间】:2012-12-21 11:33:54
【问题描述】:

我有一个包含以下格式的 tar 存档输出的文件:

-rw-r--r-- me/users       362 2011-03-01 18:23 home/me/de/bin/aur/jdk/pkg/opt/java/lib/visualvm/platform/update_tracking/org-openide-awt.xml

我要输出的只是文件名,并且只包含正好包含 2 个斜杠的文件名,即home/me/filename.txt

我不想要home/me/dir1/filename.txt,或home/me/dir1/dir2/filename.txt

我遇到了困难,因为存档中的每个文件都以 home/me/ 开头

到目前为止,我一直在尝试使用 grep 和 awk,但没有运气。我知道一旦我得到我想要的列表,我可以使用 cut 来获取文件名。

【问题讨论】:

  • 文件名不能包含斜杠(或 nul 字节)。
  • 那不是文件名,是tar内容列表。
  • 为什么不使用 maxdepth 为 2 的 find 命令?

标签: linux sed awk grep


【解决方案1】:

AWK 可以这样做:

 awk '{ orig=$NF ; if (gsub("/","",$NF) == 2) { print orig  } }' INPUTFILE

你可以see it in action here

【讨论】:

  • 非常感谢。完全按照我的要求做,我也学到了一些东西。
  • 请注意,包含空格的文件名将失败。如果您有这些,请告诉我们以获得不同的解决方案。
【解决方案2】:

我假设每一行都是相同的固定宽度格式,所以

shopt -s extglob
while IFS= read -r line; do
    if [[ "${line:47}" == +([^/])/+([^/])/+([^/]) ]]; then
        # has 2 slashes
        echo "${line:47}"
    fi
done < filename

【讨论】:

    【解决方案3】:

    @glennjackman 给了我一个强大的 awk 解决方案的想法,如果文件名包含空格(并且出现在固定位置),该解决方案将起作用:

    awk -F'^.{47}' 'gsub(/\//,"&",$2)==2{print $2}' file
    

    如果您不介意在文件路径前面添加一个额外的“/”,您可以缩写为:

    awk 'gsub(/^.{47}|\//,"/")==3' file
    

    【讨论】:

    • 您的解决方案的问题是 gsub 删除了这些斜线。因此,如果您想稍后打印它,您应该更早地保存该值。但是您可以解决匹配 gensub 结果字符串...
    • @ZsoltBotykai 不,它没有。试试看。
    • 这可能取决于您的 gawk 版本@EdMorton,请参阅此处ideone.com/Yoz0ym
    • @ZsoltBotykai 您使用的是较旧的 gawk,默认情况下没有启用 RE 间隔。添加 --re-interval 标志。
    • 不,我不是。 Ideone 正在使用旧的。还有我工作场所的服务器管理员。和世界上其他几个人。
    【解决方案4】:

    这可能对你有用(GNU sed):

    sed -rn 's|^([^ ]* *){5}(([^/]*/){2}[^/]*)$|\2|p' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2018-02-10
      相关资源
      最近更新 更多