封个bash小脚本 | 由文件(夹)的相对路径获取绝对路径
介绍
在写命令行的时候,绝对路径在服务器上调用更加方便(也看个人习惯)。
我搜了下,没有找到直接可用的工具。
感觉很简单,自己昨天写一个bash脚本。这个第一版本的脚本只能接受参数传递,如果要使用管道符,必须借用xargs
给脚本传递参数。但是经常用的话还要加xargs
,未免繁琐了点。
本次修改要求:
使用
由于经常使用,我将脚本直接放在了已经加入环境变量的路径下~/scripts
。并将其命名为rd
(= real directory)
获取单个文件绝对路径
1
2
|
$ rd 1.qc.sh
/home/data/vip13t28/workspace/pig/1.qc.sh
|
获取单个文件夹绝对路径
1
2
3
|
$ rd 2.clean_reads/
/home/data/vip13t28/workspace/pig/1.qc.sh
/home/data/vip13t28/workspace/pig/2.clean_reads
|
获取多个文件(夹)
1
2
3
4
|
$ rd 4.rseqc/ 5.stringtie_gtf nohup.out
/home/data/vip13t28/workspace/pig/4.rseqc
/home/data/vip13t28/workspace/pig/5.stringtie_gtf
/home/data/vip13t28/workspace/pig/nohup.out
|
获取多个文件绝对路径
1
2
3
4
5
6
7
8
9
10
11
|
$ ls data/SRR18059* |rd
/home/data/vip13t28/workspace/pig/data/SRR1805929_1.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805929_2.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805930_1.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805930_2.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805931_1.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805931_2.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805932_1.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805932_2.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805933_1.fastq.gz
/home/data/vip13t28/workspace/pig/data/SRR1805933_2.fastq.gz
|
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/usr/bin/env bash
# 定义函数,从相对路径获取绝对路径。
function get_pwd(){
here=$PWD;
if test -d $1 ;then
cd $1;
dir=$PWD;
echo $dir;
cd $here ; #同一个子shell下接受多个参数必须记得返回原文件夹,否则会找不到其它参数的文件(夹)。
elif test -f $1; then
here=$PWD;
tmp_file=`basename $1`;
tmp_dir=`dirname $1`;
cd $tmp_dir;
dir=$PWD;
echo "${dir}/${tmp_file}"
cd $here ; #同一个子shell下接受多个参数必须记得返回原文件夹,否则会找不到其它参数的文件(夹)。
else
echo "$1 : No such file or dirctory!"
fi
}
#
if [[ $# != 0 ]];then
for i in $@ ;do
get_pwd $i
done
else
while read line;
do
get_pwd $line
done
fi
|
小结
-
在遍历参数的时候$*
, $@
, "$@"
-
子shell中路径改变之后记得返回原路径,否则接受多个相对路径的时候只有第一个文件(夹)有结果返回。
-
从管道符接受参数的写法:while read line
写法。如果参数数量$#
为0,则尝试从标准输出用管道符
-
思路真的很重要,基础真的很重要。这点思路尝试写了一个多小时才转过脑筋来。