我有一个文件(比如名为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
答案 0 :(得分:93)
使用basename
和dirname
,这就是您所需要的一切。
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
并且它不会为每个文件分叉dirname
和basename
(在子shell中)。
行[[ "$p" == */* ]] || p="./$p"
就在这里,以防$p
不包含任何斜杠,然后它会./
加上它。
有关%
和##
符号的详细信息,请参阅Shell Parameter Expansion中的Bash Reference Manual部分。
答案 2 :(得分:4)
回应@ gniourf_gniourf对@ piokuc答案的批评,同时保持简短(如果效率不高):
part1=`dirname "$p"`
part2=`basename "$p"`
(我会在评论中作出回应,但这在语法上是不可能的。)
答案 3 :(得分:1)
答案 4 :(得分:-3)
以下是查找和替换xml文件扩展名的一个示例。
for files in $(ls); do
filelist=$(echo $files |cut -f 1 -d ".");
mv $files $filelist.xml;
done