ディレクトリの移動とファイル/ディレクトリの一覧表示

システム管理でもっとも基本となる操作はディレクトリ(フォルダ)の 移動とファイルやディレクトリの一覧表示だ。

ディレクトリの移動にはSet-Locationコマンドレットを使うのだが、Set-Locationにはcdというエイリアスが用意されており、操作する場合には基本的にはこちらを使う。macOSやLinux、コマンドプロンプトでもディレクトリの移動はcdなので、それに合わせたかたちだろう。

移動した先のディレクトリでファイルなどを一覧表示させるにはlsやdirを使う。これに相当するPowerShellのコマンドレットはGet-ItemとGet-ChildItemだ。

lsやdirと同じ動きをするという点から言えば、Get-ChildItemの動作がそれに近い。覚えるコマンドレットを最小限に抑えたいならGet-ChildItemの動きを覚えておくとよいと思う。

ファイルやディレクトリの表示

ファイルやディレクトリを表示させるには次のようにGet-Itemを使用する。基本的には引数にファイルやディレクトリのパスを指定するだけでよい。

Get-Itemでファイルを表示

PS /Users/daichi/Documents/powershell> Get-Item Makefile


    Directory: /Users/daichi/Documents/powershell


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------       2018/05/16     16:51           2980 Makefile


PS /Users/daichi/Documents/powershell>

Get-Itemでディレクトリを表示

PS /Users/daichi/Documents/powershell> Get-Item 20180514


    Directory: /Users/daichi/Documents/powershell


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/05/16     16:59                20180514


PS /Users/daichi/Documents/powershell>

筆者はmacOSでPowerShell Coreを使っているので、アプリケーションとしてPowerShellからmacOSのlsコマンドも実行できる。lsで同じ処理を行うと次のようになる(「-l」は、詳細情報を表示するオプション)。

lsでファイルを表示

PS /Users/daichi/Documents/powershell> ls -l Makefile
-rw-r--r--  1 daichi  staff  2980  5 16 16:51 Makefile
PS /Users/daichi/Documents/powershell>

lsでディレクトリを表示

PS /Users/daichi/Documents/powershell> ls -ld 20180514
drwxr-xr-x  5 daichi  staff  160  5 16 16:59 20180514
PS /Users/daichi/Documents/powershell>

ちなみに、Windows 10でlsを実行するとエイリアスが設定されていてGet-ChildItemが動作する。lsコマンドの出力を得たいならmacOSやLinuxでコマンドを実行してみてほしい。

Get-Itemコマンドの出力形式は次のようになっている。モードは1文字が1モードを表していて、次のようになっている。macOSやLinuxの出力とは異なっている。

項目 内容
Mode モード(darhsl)
LastWriteTime 最終書込時間
length ファイルサイズ
Name ファイル名やディレクトリ名
モード文字 意味
d ディレクトリ(directory)
a アーカイブ(archive)
r 読み込みオンリー(read-only)
h 隠し(hidden)
s システム(system)
l リンク(link)

Get-Itemの引数に.を指定するとカレントディレクトリを表示する。lsコマンドで同じことをする場合にはオプションとして-dを指定する。

Get-Itemに.を指定するとカレントディレクトを表示

PS /Users/daichi/Documents/powershell> Get-Item .


    Directory: /Users/daichi/Documents


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/05/16     16:59                powershell


PS /Users/daichi/Documents/powershell>

lsで同じことをする場合には-dを加える

PS /Users/daichi/Documents/powershell> ls -ld .
drwxr-xr-x  13 daichi  staff  416  5 16 16:59 .
PS /Users/daichi/Documents/powershell>

lsは引数にディレクトリが指定された場合には、そのディレクトリ下のファイルやディレクトリの一覧を表示する。Get-Itemは指定されたディレクトリそのもののデータを表示する。このあたりがlsやdirとGet-Itemの動作の違いだ。

ファイルやディレクトリの一覧表示

ファイルやディレクトリ単体ではなく、カレントディレクトリや指定したディレクトリ下のファイルやディレクトリを一覧表示したい場合にはGet-Itemの引数に*を指定する。

Get-Itemの引数に*を指定すると該当するすべてのファイルやディレクトリが一覧表示される

PS /Users/daichi/Documents/powershell> Get-Item *


    Directory: /Users/daichi/Documents/powershell


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/05/16     16:51                20180402
d-----       2018/05/16     16:51                20180409
d-----       2018/05/16     16:51                20180416
d-----       2018/05/16     16:51                20180423
d-----       2018/05/16     16:51                20180507
d-----       2018/05/16     16:59                20180514
d-----       2018/05/16     16:51                mk
d-----       2018/05/16     16:51                template
d-----       2018/05/16     16:51                tools
------       2018/05/16     16:51           2980 Makefile


PS /Users/daichi/Documents/powershell>

これはlsコマンドを引数なしで実行したときの動作に似ている。

lsでファイルやディレクトリを一覧表示

PS /Users/daichi/Documents/powershell> ls -l
total 8
drwxr-xr-x  6 daichi  staff   192  5 16 16:51 20180402
drwxr-xr-x  7 daichi  staff   224  5 16 16:51 20180409
drwxr-xr-x  6 daichi  staff   192  5 16 16:51 20180416
drwxr-xr-x  7 daichi  staff   224  5 16 16:51 20180423
drwxr-xr-x  8 daichi  staff   256  5 16 16:51 20180507
drwxr-xr-x  5 daichi  staff   160  5 16 16:59 20180514
-rw-r--r--  1 daichi  staff  2980  5 16 16:51 Makefile
drwxr-xr-x  5 daichi  staff   160  5 16 16:51 mk
drwxr-xr-x  7 daichi  staff   224  5 16 16:51 template
drwxr-xr-x  5 daichi  staff   160  5 16 16:51 tools
PS /Users/daichi/Documents/powershell>

カレントディレクトリではなく特定のディレクトリ下のファイルやディレクトリを一覧表示させたいという場合、Get-Itemを使うなら次のように一旦カレントディレクトリを移動してから同じようにGet-Itemを実行する。

対象のディレクトリに移動してGet-Itemを実行

PS /Users/daichi/Documents/powershell> Set-Location 20180514
PS /Users/daichi/Documents/powershell/20180514> Get-Item *


    Directory: /Users/daichi/Documents/powershell/20180514


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------       2018/05/16     16:59            557 Makefile
------       2018/05/16     16:59           1274 typescript.xml


PS /Users/daichi/Documents/powershell/20180514>

lsで同じことを実施するとこうなる

PS /Users/daichi/Documents/powershell> cd 20180514
PS /Users/daichi/Documents/powershell/20180514> ls -l
total 16
-rw-r--r--  1 daichi  staff   557  5 16 16:59 Makefile
-rw-r--r--  1 daichi  staff  1274  5 16 16:59 typescript.xml
PS /Users/daichi/Documents/powershell/20180514>

Get-ItemではなくGet-ChildItemを使うと、カレントディレクトリを移動しなくとも対象となるディレクトリを指定することで、そのディレクトリ下のファイルやディレクトリを一覧表示させることができる。

Get-ChildItemは引数にディレクトリを指定すると、そのディレクトリ以下のファイルやディレクトリが一覧表示される

PS /Users/daichi/Documents/powershell> Get-ChildItem 20180514


    Directory: /Users/daichi/Documents/powershell/20180514


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------       2018/05/16     16:59            557 Makefile
------       2018/05/16     16:59           1274 typescript.xml


PS /Users/daichi/Documents/powershell>

lsコマンドで同じことをするとこうなる

PS /Users/daichi/Documents/powershell> ls -l 20180514
total 16
-rw-r--r--  1 daichi  staff   557  5 16 16:59 Makefile
-rw-r--r--  1 daichi  staff  1274  5 16 16:59 typescript.xml
PS /Users/daichi/Documents/powershell>

このようにGet-ChildItemの方がlsやdirと動作が似ている。

隠しファイルやディレクトリの表示

WindowsにもmacOSにもLinuxにも、いわゆる隠しファイルと呼ばれるファイルが存在している。通常は表示させない用途で使われるものだ。Get-ChildItemには-Forceを指定するとこの隠しファイルを表示させることができる。

Get-ChildItemは-Forceを指定すると隠しファイルも表示するようになる

PS /Users/daichi/Documents/powershell> Get-ChildItem 20180514 -Force


    Directory: /Users/daichi/Documents/powershell/20180514


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
---h--       2018/05/16     16:59              0 .cms-done
------       2018/05/16     16:59            557 Makefile
------       2018/05/16     16:59           1274 typescript.xml


PS /Users/daichi/Documents/powershell>

lsでは-aを指定すると隠しファイルが表示される

PS /Users/daichi/Documents/powershell> ls -al 20180514
total 16
drwxr-xr-x   5 daichi  staff   160  5 16 16:59 .
drwxr-xr-x  13 daichi  staff   416  5 16 16:59 ..
-rw-r--r--   1 daichi  staff     0  5 16 16:59 .cms-done
-rw-r--r--   1 daichi  staff   557  5 16 16:59 Makefile
-rw-r--r--   1 daichi  staff  1274  5 16 16:59 typescript.xml
PS /Users/daichi/Documents/powershell>

設定ファイルは隠しファイルや、または隠しディレクトリ以下に置かれていることがあるので、その場合には-Forceを指定して確認すればよいということになる。

名前だけを表示

lsはオプションを指定しない限り、ファイルやディレクトリの詳細表示は行わず、名前しか表示しない。

lsコマンドのデフォルト動作はシンプル

PS /Users/daichi/Documents/powershell> ls 20180514
Makefile    typescript.xml
PS /Users/daichi/Documents/powershell>

Get-ChildItemで同じことをしたい場合には-Nameを指定する。

Get-ChildItemに-Nameを指定すると詳細表示ではなく名前だけを表示するようになる

PS /Users/daichi/Documents/powershell> Get-ChildItem 20180514 -Name
Makefile
typescript.xml
PS /Users/daichi/Documents/powershell>

シンボリックリンクやハードリンクを表示

Windowsではショートカット、macOSやLinuxではシンボリックリンクやハードリンクといった種類のファイルを作成することができる。

Get-ItemやGet-ChildItemではモード部分の6文字目がlだった場合には対象がリンクファイルであることを示している。

モードの6文字目がlならリンクファイル

PS /Users/daichi/Documents/powershell> Get-Item /usr/local/bin/xz


    Directory: /usr/local/bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-----l       2017/11/09     11:22             25 xz


PS /Users/daichi/Documents/powershell>

このままだとどのファイルへのリンクかわからないのだが、結果をFormat-Listコマンドレットにつないであげると、次のようにリンクの種類やどのファイルへのリンクかを表示させることが可能になる。

この場合だと/usr/local/bin/xzというファイルはシンボリックリンクで、/usr/local/Cellar/xz/5.2.3/bin/xzを指し示していることがわかる。

Format-Listにつなげてリンクファイルの詳細を表示

PS /Users/daichi/Documents/powershell> Get-Item /usr/local/bin/xz | Format-List


    Directory: /usr/local/bin



Name           : xz
Length         : 25
CreationTime   : 2017/11/09 11:22:05
LastWriteTime  : 2017/11/09 11:22:05
LastAccessTime : 2017/11/09 11:22:05
Mode           : -----l
LinkType       : SymbolicLink
Target         : {/usr/local/Cellar/xz/5.2.3/bin/xz}
VersionInfo    : File:             /usr/local/bin/xz
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:




PS /Users/daichi/Documents/powershell>

シンボリックリンクではなくハードリンクに対して同じように操作をしてあげると、次のようにそれがハードリンクであることを確認できる。

ハードリンクファイルをGet-Itemで表示

PS /Users/daichi/Documents/powershell> Get-Item /usr/bin/zmore


    Directory: /usr/bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
--r--l       2017/07/16      6:08           2080 zmore


PS /Users/daichi/Documents/powershell>

Format-Listにつなげて詳細を表示するとハードリンクであることを確認できる

PS /Users/daichi/Documents/powershell> Get-Item /usr/bin/zmore | Format-List


    Directory: /usr/bin



Name           : zmore
Length         : 2080
CreationTime   : 2017/07/16 6:08:37
LastWriteTime  : 2017/07/16 6:08:37
LastAccessTime : 2018/05/16 18:04:13
Mode           : --r--l
LinkType       : HardLink
Target         :
VersionInfo    : File:             /usr/bin/zmore
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:




PS /Users/daichi/Documents/powershell>

ちなみに次のようにアプリケーション(lsコマンドとgrepコマンド)を利用すると、どのファイルがハードリンクの関係にあるかを調べることもできる。

どのファイルがハードリンクの関係にあるかをチェック

PS /Users/daichi/Documents/powershell> ls -il /usr/bin/ | grep 8590660753
8590660753 -rwxr-xr-x   2 root   wheel      2080  7 16  2017 zless
8590660753 -rwxr-xr-x   2 root   wheel      2080  7 16  2017 zmore
PS /Users/daichi/Documents/powershell>

ショートカットファイルとシンボリックリンクは似ている。ハードリンクはこの連載の範囲を超えるので詳しくは説明しないが、そういう種類(仕組み)のファイルがあるということくらいは知っておいてもらえればと思う。

Get-ChildItemの動作を抑えておけばだいたい欲しい機能は網羅できると思うので、まずはこのコマンドレットは覚えてしまおう。