Bash文字列処理(Javaと照合)-24.ファイルパス文字列の処理(パス処理)


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
問題が発生しました.2行目は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();
 
JAvadoc File.getCanonicalPath()&File.getCanonicalFile()は
getCanonicalPath
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スクリプトdollar 0.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]#
 
注意:ネット上には以下のような文章がありますが、明らかに正しくありません.
http://songzhangzhang.blog.163.com/blog/static/6940198120116201641361/と書く
bashスクリプトで$0は、スクリプトファイルのフルパスファイル名です.スクリプトの呼び出し方法が特定のファイルパスを直接指定するか、スクリプトファイルが存在するディレクトリをPATH環境変数に配置するかにかかわらず.
 
現在の実行スクリプトが存在するディレクトリ
dirnameコマンドは、指定したファイルのディレクトリ部分を取得できます.
info dirnameは
18.2 `dirname': Strip non-directory suffix from a file name
===========================================================
`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は必ずしも全パスディレクトリを得るとは限らず,呼び出し方式によって異なる結果が得られる.
 
前のdollar 0スクリプトを改良し、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コマンドは、指定したファイルのファイル名セクションを取得します.
info basenameは
18.1 `basename': Strip directory and suffix from a file name
============================================================
`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.文字列分割(配列)