Ubuntu bash脚本:如何通过最后一个斜杠拆分路径?

时间:2012-12-07 16:40:05

标签: bash split

我有一个文件(比如名为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

我如何拆分?当路径没有斜线时,这会在退化的情况下工作吗?

THX

5 个答案:

答案 0 :(得分:93)

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

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

答案 1 :(得分:13)

适当的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不包含任何斜杠,然后它会./加上它。

有关%##符号的详细信息,请参阅Shell Parameter Expansion中的Bash Reference Manual部分。

答案 2 :(得分:4)

回应@ gniourf_gniourf对@ piokuc答案的批评,同时保持简短(如果效率不高):

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

(我会在评论中作出回应,但这在语法上是不可能的。)

答案 3 :(得分:1)

source

的绝佳解决方案
p=/foo/bar/file1
path=$( echo ${p%/*} )
file=$( echo ${p##/*/} )

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

答案 4 :(得分:-3)

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

for files in $(ls); do

    filelist=$(echo $files |cut -f 1 -d ".");
    mv $files $filelist.xml;
done