Ubuntu bash脚本:如何按最后一个斜杠分割路径?

bash split

50558 观看

5回复

2289 作者的声誉

我有一个文件(称为list.txt),其中包含文件的相对路径,每行一个路径,即类似这样的内容:

foo/bar/file1
foo/bar/baz/file2
goo/file3

我需要编写一个bash脚本,该脚本一次处理一个路径,在最后一个斜杠处将其拆分,然后启动另一个进程,将其作为参数传递给这两个路径。到目前为止,我只有循环部分:

for p in `cat list.txt`
do
   # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2
   inner_process.sh $part1 $part2
done

我如何分割?当路径没有斜线时,这种方法在退化的情况下会起作用吗?

谢谢

作者: I Z 的来源 发布者: 2012 年 12 月 7 日

回应 5


97

18143 作者的声誉

决定

使用basenamedirname,这就是您所需要的。

part1=`dirname "$p"`
part2=`basename "$p"`
作者: piokuc 发布者: 2012 年 12 月 7 日

13

32695 作者的声誉

正确的100%bash方式,对于带有空格或有趣符号的文件名是安全的(提供的文件名可以inner_process.sh正确处理,但这又是另一回事了):

while read -r p; do
    [[ "$p" == */* ]] || p="./$p"
    inner_process.sh "${p%/*}" "${p##*/}"
done < list.txt

和它不叉dirnamebasename(在子shell),用于每个文件。

这行[[ "$p" == */* ]] || p="./$p"是为了防止$p不包含任何斜线,然后将其添加./到该行。

有关和符号的更多信息,请参见Bash参考手册中Shell参数扩展部分。%##

作者: gniourf_gniourf 发布者: 2012 年 12 月 7 日

-3

5 作者的声誉

这是一个查找和替换xml文件扩展名的示例。

for files in $(ls); do

    filelist=$(echo $files |cut -f 1 -d ".");
    mv $files $filelist.xml;
done
作者: Sanjeeb Mohanta 发布者: 2014 年 8 月 13 日

4

14523 作者的声誉

要回应@gniourf_gniourf对@piokuc答案的批评,同时使其简短而简单(如果效率不高):

part1=`dirname "$p"`
part2=`basename "$p"`

(我本来会在评论中回答的,但是从语法上讲这是不可能的。)

作者: Gordon 发布者: 2016 年 12 月 13 日

1

559 作者的声誉

来源的绝佳解决方案

p=/foo/bar/file1
path=$( echo ${p%/*} )
file=$( echo ${p##/*/} )

这也适用于路径中的空格!

作者: Phil Roggenbuck 发布者: 2018 年 6 月 21 日
32x32