【问题标题】:Shell script to truncate branch information and directories用于截断分支信息和目录的 Shell 脚本
【发布时间】:2013-06-16 11:42:34
【问题描述】:

需要 cut/awk 脚本来截断“/branches/testbranch/”并获取文件的目录路径但忽略目录

/branches/testbranch/abc/efg/hij/klm/casestudy
/branches/testbranch/abc/efg/hij/klm/casestudy/testBlocksCargo.java
/branches/testbranch/abc/efg/hij/klm/casestudy/testBlocksCollection.java
/branches/testbranch/abc/efg/hij/klm/casestudy/testBlocksPrimaryKey.java
/branches/testbranch/claims/returns/policy/checkmate/casestudy
/branches/testbranch/claims/returns/policy/checkmate/casestudy/testBlocksGenDAO.java
/branches/testbranch/claims/returns/policy/checkmate/casestudy/testIndexGenDAO.java

期望的输出:

abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
claims/returns/policy/checkmate/casestudy
claims/returns/policy/checkmate/casestudy

我的脚本:

while read line
do
      change_directory=`echo "$line" | awk -F'/[^/]*$' '{sub("/branches/testbranch/","",$1)}$0=$1'`
      echo "$change_directory"
done <"test

脚本输出:

 abc/efg/hij/klm
 abc/efg/hij/klm/casestudy
 abc/efg/hij/klm/casestudy
 abc/efg/hij/klm/casestudy
 claims/returns/policy/checkmate
 claims/returns/policy/checkmate/casestudy
 claims/returns/policy/checkmate/casestudy

目录和分支详细信息发生变化

【问题讨论】:

  • 如何区分文件和文件夹?你是说所有文件都有扩展名吗?

标签: bash shell scripting awk cut


【解决方案1】:

我认为这就是你想要的(它至少符合你的预期输出):

Unix 方法:

# Strip leading dirs based on char count
$ fgrep . file | cut -c22- | xargs -n1 dirname
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
claims/returns/policy/checkmate/casestudy
claims/returns/policy/checkmate/casestudy

# Strip leading dirs based on number of dirs 
$ fgrep . file | cut -d/ -f4- | xargs -n1 dirname
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
claims/returns/policy/checkmate/casestudy
claims/returns/policy/checkmate/casestudy

awk 方法:

$ awk '/[.]/{NF--;print substr($0,22)}' FS=/ OFS=/ file
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
abc/efg/hij/klm/casestudy
claims/returns/policy/checkmate/casestudy
claims/returns/policy/checkmate/casestudy

【讨论】:

    【解决方案2】:

    使用 GNU Find 和 GNU Sed

    找到 testbranch 下的所有文件,然后使用 sed 去除您希望丢弃的路径名的前导部分。

    find /branches/testbranch -type f | sed 's!/branches/testbranch/!!'
    

    其他版本的 find 和 sed 可能需要也可能不需要修改此管道。 YMMV。

    【讨论】:

    • 我想你想要! -type d(或者只是-type f)来回答这个问题。
    【解决方案3】:

    awk 的一种方式:

     awk -F/ '$NF~/\./{for(i=4;i<(NF-1);i++) printf "%s/", $i; print $(NF-1)}' test
    

    测试:

    $  awk -F/ '$NF~/\./{for(i=4;i<(NF-1);i++) printf "%s/", $i; print $(NF-1)}' test
    abc/efg/hij/klm/casestudy
    abc/efg/hij/klm/casestudy
    abc/efg/hij/klm/casestudy
    claims/returns/policy/checkmate/casestudy
    claims/returns/policy/checkmate/casestudy
    

    【讨论】:

    • /branches/testbranch/abc/ 目录中的文件呢?我不认为NR&gt;8 是一个合理的假设
    • @sudo_O 这看起来更好吗?
    • while read line do change_directory=echo "$line" | awk -F/ '$NF~/\./{for(i=4;i
    • 为什么要这样跑。只需在文件上直接运行awk 命令。你不需要while loopawk 默认从一行移动到另一行。
    • 我需要读取一个包含 500 多行的文件并通过忽略作为目录的行来做一些事情
    【解决方案4】:

    它们是真正的目录和文件吗?

    while read; do
        if [[ -f "$REPLY" ]]; then # Test if the input exists and is a file
            change_directory="${REPLY#/branches/testbranch/}"
            printf '%s\n' "${change_directory%/*}"
        fi
    done < test
    

    【讨论】:

      【解决方案5】:

      使用 sed:

      sed -e 's#^/branches/testbranch/##' -e 's#/[^/.]*\..*$##' file
      

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多