- 浏览: 4733629 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
bzhao:
你也应该可以这样:(not tested)./rbtunnel ...
在Bash脚本中怎么关闭文件描述符? -
bzhao:
如果有A进程原代码情况下,通过如下调用,把他的子进程继承关闭则 ...
在Bash脚本中怎么关闭文件描述符? -
Master-Gao:
楼主咋没分析下源码呢?
我使用过的Linux命令之dirname - 截取给定路径的目录部分 -
jiedushi:
tail -F 就可以吧
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能 -
java_is_new:
新手学习了,就是不明白为一个网卡配多个ip有什么用
我使用过的Linux命令之ifconfig - 网络配置命令
Bash字符串处理(与Java对照) - 24.文件路径字符串的处理(路径处理)
In Java
File类:得到指定文件的文件名、文件所在目录
import java.io.File; public class TestFile { public static void main(String[] args) { String filename = "hello.txt"; // 创建File对象 File file = new File(filename); // 得到文件名 String name = file.getName(); System.out.println("name=" + name); // 得到目录 String dir = file.getParent(); System.out.println("dir=" + dir); } }
[root@jfht params]# javac TestFile.java && java TestFile
name=hello.txt
dir=null
问题来了,第二行打印null,无法得到文件所在目录。
import java.io.File; import java.io.IOException; public class TestFile { public static void main(String[] args) throws IOException { String filename = "hello.txt"; // 创建File对象 File file = new File(filename); // 得到路径 String path = file.getPath(); System.out.println("path=" + path); // 得到文件名 String name = file.getName(); System.out.println("name=" + name); // 得到目录 String dir = file.getParent(); System.out.println("dir=" + dir); // 得到绝对路径 String apath = file.getAbsolutePath(); System.out.println("apath=" + apath); // 得到规范路径 String cpath = file.getCanonicalPath(); System.out.println("cpath=" + cpath); // 得到绝对文件对象 File file2 = file.getAbsoluteFile(); String dir2 = file2.getParent(); System.out.println("dir2=" + dir2); // 得到规范文件对象 File file3 = file.getCanonicalFile(); String dir3 = file3.getParent(); System.out.println("dir3=" + dir3); } }
[root@jfht params]# javac TestFile.java && java TestFile
path=hello.txt
name=hello.txt
dir=null
apath=/opt/shtools/params/hello.txt
cpath=/opt/shtools/params/hello.txt
dir2=/opt/shtools/params
dir3=/opt/shtools/params
[root@jfht params]#
如果把filename改成 "./hello.txt",执行结果如下:
[root@jfht params]# javac TestFile.java && java TestFile
path=./hello.txt
name=hello.txt
dir=.
apath=/opt/shtools/params/./hello.txt
cpath=/opt/shtools/params/hello.txt
dir2=/opt/shtools/params/.
dir3=/opt/shtools/params
[root@jfht params]#
如果把filename改成 "../hello.txt",执行结果如下:
[root@jfht params]# javac TestFile.java && java TestFile
path=../hello.txt
name=hello.txt
dir=..
apath=/opt/shtools/params/../hello.txt
cpath=/opt/shtools/hello.txt
dir2=/opt/shtools/params/..
dir3=/opt/shtools
[root@jfht params]#
现在,总结一下:
得到文件所在目录的有效方法是:
file.getCanonicalFile().getParent();
public String getCanonicalPath() throws IOException
返回抽象路径名的规范路径名字符串。
规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。
表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。
返回:
表示与此抽象路径名相同的文件或目录的规范路径名字符串
抛出:
IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)
SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对该文件进行读取访问
从以下版本开始:
JDK1.1
getCanonicalFile
public File getCanonicalFile() throws IOException
返回此抽象路径名的规范形式。等同于 new File(this.getCanonicalPath()())。
返回:
表示与此抽象路径名相同的文件或目录的规范路径名字符串
抛出:
IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)
SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对该文件进行读取访问
从以下版本开始:
1.2
In Bash
当前执行脚本的文件名
在bash中,位置参数$0就是调用脚本时的文件名。
Bash脚本 dollar0.sh
#!/bin/sh echo "$0" # END.
[root@jfht params]# ./dollar0.sh
./dollar0.sh
[root@jfht params]# $(pwd)/dollar0.sh
/opt/shtools/params/dollar0.sh
[root@jfht params]# ../params/dollar0.sh
../params/dollar0.sh
[root@jfht params]# sh dollar0.sh
dollar0.sh
[root@jfht params]# PATH=.:$PATH dollar0.sh
./dollar0.sh
[root@jfht params]# PATH=$(pwd):$PATH dollar0.sh
/opt/shtools/params/dollar0.sh
[root@jfht params]#
注意:网上有文章如下所说,显然是不太正确的。
当前执行脚本所在目录
dirname命令可以得到指定文件的目录部分。
===========================================================
`dirname' prints all but the final slash-delimited component of a
string (presumably a file name). Synopsis:
dirname NAME
If NAME is a single component, `dirname' prints `.' (meaning the
current directory).
The only options are `--help' and `--version'. *Note Common
options::.
An exit status of zero indicates success, and a nonzero value
indicates failure.
Examples:
# Output "/usr/bin".
dirname /usr/bin/sort
# Output ".".
dirname stdio.h
对前面的脚本进行修改,增加对执行脚本文件所在目录的打印输出。
#!/bin/sh echo "$0" echo "$(dirname "$0")" # END.
[root@jfht params]# ./dollar0.sh
./dollar0.sh
.
[root@jfht params]# $(pwd)/dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
[root@jfht params]# ../params/dollar0.sh
../params/dollar0.sh
../params
[root@jfht params]# sh dollar0.sh
dollar0.sh
.
[root@jfht params]# PATH=.:$PATH dollar0.sh
./dollar0.sh
.
[root@jfht params]# PATH=$(pwd):$PATH dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
[root@jfht params]#
得到指定目录的全路径目录
从上面的例子看出,dirname不一定得到全路径目录,随着调用方式的不同会有不同的结果。
对前面的dollar0脚本进行改进,增加realdir函数,用于打印指定目录的全路径。
#!/bin/sh echo "$0" echo "$(dirname "$0")" fulldir() { (cd "$1" && pwd) } echo "$(fulldir "$(dirname "$0")")" # END.
[root@jfht params]# ./dollar0.sh
./dollar0.sh
.
/opt/shtools/params
[root@jfht params]# $(pwd)/dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
/opt/shtools/params
[root@jfht params]# ../params/dollar0.sh
../params/dollar0.sh
../params
/opt/shtools/params
[root@jfht params]# sh dollar0.sh
dollar0.sh
.
/opt/shtools/params
[root@jfht params]# PATH=.:$PATH dollar0.sh
./dollar0.sh
.
/opt/shtools/params
[root@jfht params]# PATH=$(pwd):$PATH dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
/opt/shtools/params
[root@jfht params]#
得到指定文件的文件名部分
basename命令可以得到指定文件的文件名称部分。
============================================================
`basename' removes any leading directory components from NAME.
Synopsis:
basename NAME [SUFFIX]
If SUFFIX is specified and is identical to the end of NAME, it is
removed from NAME as well. `basename' prints the result on standard
output.
The only options are `--help' and `--version'. *Note Common
options::. Options must precede operands.
An exit status of zero indicates success, and a nonzero value
indicates failure.
Examples:
# Output "sort".
basename /usr/bin/sort
# Output "stdio".
basename include/stdio.h .h
当前执行脚本的全路径文件名
继续对上面的脚本进行改进,增加fullname函数来得到指定文件的全路径。
#!/bin/sh echo "$0" echo "$(dirname "$0")" # usage: fulldir <dir> fulldir() { (cd "$1" && pwd) } echo "$(fulldir "$(dirname "$0")")" # usage: fullname <dirname_ro_filename> fullname() { local dir=$(dirname "$0") local name=$(basename "$0") echo "$(cd "$dir" && pwd)/$name" } echo "$(fullname "$0")" # END.
[root@jfht params]# ./dollar0.sh
./dollar0.sh
.
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]# $(pwd)/dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]# ../params/dollar0.sh
../params/dollar0.sh
../params
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]# sh dollar0.sh
dollar0.sh
.
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]# PATH=.:$PATH dollar0.sh
./dollar0.sh
.
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]# PATH=$(pwd):$PATH dollar0.sh
/opt/shtools/params/dollar0.sh
/opt/shtools/params
/opt/shtools/params
/opt/shtools/params/dollar0.sh
[root@jfht params]#
补充:echo $PWD与pwd
在bash中,pwd命令与echo $PWD得到的结果是一样的,因此上面的脚本也可以如下编写。
#!/bin/sh echo "$0" echo "$(dirname "$0")" # usage: fulldir <dir> fulldir() { (cd "$1" && echo "$PWD") } echo "$(fulldir "$(dirname "$0")")" # usage: fullname <dirname_ro_filename> fullname() { local dir=$(dirname "$0") local name=$(basename "$0") echo "$(cd "$dir" && echo "$PWD")/$name" } echo "$(fullname "$0")" # END.
本文链接:http://codingstandards.iteye.com/blog/1164909 (转载请注明出处)
返回目录:Java程序员的Bash实用指南系列之字符串处理(目录)
上节内容:Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取
下节内容:Bash字符串处理(与Java对照) - 25.字符串分割(成数组)
发表评论
-
Bash字符串处理(与Java对照) - 22.判断字符串是否数字串
2011-10-25 09:25 5427Bash字符串处理(与Java对照) - 22.判断字符串是否 ... -
Bash字符串处理(与Java对照) - 21.字符串正则匹配
2011-10-24 09:07 11010Bash字符串处理(与Java对照) - 21.字符串正则匹配 ... -
Bash字符串处理(与Java对照) - 20.查找子串的位置
2011-10-19 09:14 6735Bash字符串处理(与Java对照) - 20.查找子串的位置 ... -
Bash字符串处理(与Java对照) - 19.查找字符的位置
2011-10-18 09:06 5902Bash字符串处理(与Java对照) - 19.查找字符的位置 ... -
Bash字符串处理(与Java对照) - 18.格式化字符串
2011-10-17 09:18 4928Bash字符串处理(与Java对照) - 18.格式化字符串 ... -
Bash字符串处理(与Java对照) - 17.判断是否以另外的字符串结尾
2011-10-09 08:58 6931Bash字符串处理(与Java对照) - 17.判断是否以另外 ... -
Bash字符串处理(与Java对照) - 16.判断是否以另外的字符串开头
2011-10-08 09:17 8302Bash字符串处理(与Java对照) - 16.判断是否以另外 ... -
Bash字符串处理(与Java对照) - 15.计算子串出现的次数
2011-09-28 09:37 3369Bash字符串处理(与Java对照) - 15.计算子串出现的 ... -
Bash字符串处理(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)
2011-09-27 13:22 8269Bash字符串处理(与Java对照) - 14.判断是否包含另 ... -
Bash字符串处理(与Java对照) - 13.字符串数组连接(以指定分隔符合并)
2011-09-26 09:19 5119Bash字符串处理(与Java对照) - 13.字符串数组连接 ... -
Bash字符串处理(与Java对照) - 12.字符串连接
2011-09-23 09:08 6315Bash字符串处理(与Java对照) - 12.字符串连接 ... -
Bash字符串处理(与Java对照) - 11.比较两个字符串大小(字典顺序、数值比较)
2011-09-21 09:31 5648Bash字符串处理(与Java对照) - 11.比较两个字符串 ... -
Bash字符串处理(与Java对照) - 10.判断两个字符串是否相等(不等)
2011-09-20 09:16 6845Bash字符串处理(与Java对照) - 10.判断两个字符串 ... -
Bash字符串处理(与Java对照) - 9.获取字符串指定位置的字符、遍历字符串中的字符
2011-09-19 09:13 3694Bash字符串处理(与Java对照) - 9.获取字符串指定位 ... -
Bash字符串处理(与Java对照) - 8.计算字符串长度
2011-09-16 09:20 5596Bash字符串处理(与Java对照) - 8.计算字符串长度 ... -
Bash字符串处理(与Java对照) - 7.字符串与默认值
2011-09-15 09:20 3895Bash字符串处理(与Java对照) - 7.字符串与默认值 ... -
Bash字符串处理(与Java对照) - 6.判断字符串是否为空(不为空)
2011-09-14 09:20 7159Bash字符串处理(与Java对照) - 6.判断字符串是否为 ... -
Bash字符串处理(与Java对照) - 5.字符串输入(读取字符串)
2011-09-13 09:28 3886Bash字符串处理(与Java对照) - 5.字符串输入(读取 ... -
Bash字符串处理(与Java对照) - 4.字符串输出
2011-09-08 09:30 3700Bash字符串处理(与Java对照) - 4.字符串输出 I ... -
Bash字符串处理(与Java对照) - 3.给(字符串)变量赋值
2011-09-07 09:29 6838Bash字符串处理(与Java ...
相关推荐
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 ffmpeg 安装用包!
在centos6或rhel6 操作系统安装bash-completion-2.1-6.el7.noarch.rpm后,重启即生效
离线安装包,测试可用
libguestfs-bash-completion-1.40.2-28.module_el8.5.0+821+97472045.noarch(1).rpm官方离线安装包,亲测可用
-bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...
openjdk-18.0.1.1(openjdk-18.0.1.1_linux-x64_bin.tar.gz)适用于Linux x64 系统:
git-bash.exe
修改redhat 7 bash远程执行任意代码漏洞
bash-4.1.2-9.el6_2.i686.rpm是centos工具类。
在Linux下使用sqlplus或者rman时,经常...3. 修改配置文件 vi .bash_profile 增加:alias sqlplus='rlwrap sqlplus' alias rman='rlwrap rman' alias lsnrctl='rlwrap lsnrctl' 4. 生效: source .bash_profile
redhat bash漏洞补丁包含文件:bash-4.1.2-15.el6_5.2.i686.rpmbash-4.1.2-15.el6_5.2.x86_64.rpmbash-3.0-27.el4.i386.rpmbash-3.0-27.el4.x86_64.rpmbash-3.2-33.el5_11.4.i386.r... redhat bash漏洞补丁 包含文件...
修复redhat6 bash远程执行任意代码漏洞CVE-2014-6271
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
命令补全 Centos6/7或Rhel6/7 安装 bash-completion-2.1-6.el7.noarch.rpm 后重启即生效
.git-completion.bash
网上有很多bash补丁下载,但都是x86_64架构的,针对i686的下载很少,bash-4.1.2-15.el6_5.2.src.rpm 也很难下载,希望上传的这个bash-4.1.2-15.el6_5.2.i686.rpm对你有用。
#tar zxvf bash-4.4.tar.gz #cd bash-4.4 #./configure (如果centos7编译失败,请先安装#yum install gcc) #make #make install 添加环境变量 #echo‘ export PATH=/usr/local/bin:$PATH‘ >>/etc/profile #source...
执行如下命令查看设备是否存在bash安全漏洞。 #env -i X='() { (a)=>\\' bash -c '/dev/stdout echo vulnerable' 2>/dev/null 判定依据 如果以上命令的输出为以下内容则不合规: vulnerable