ディレクトリの移動とファイル/ディレクトリの一覧表示
システム管理でもっとも基本となる操作はディレクトリ(フォルダ)の 移動とファイルやディレクトリの一覧表示だ。
ディレクトリの移動には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の動作を抑えておけばだいたい欲しい機能は網羅できると思うので、まずはこのコマンドレットは覚えてしまおう。
参考資料
- Microsoft PowerShell Module Browser
- Microsoft PowerShell6|Microsoft.PowerShell.Management|Get-Item
- Microsoft PowerShell6|Microsoft.PowerShell.Management|Get-ChildItem
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-List
- Stack Overflow|What are the possible ‘Mode’ values returned by PowerShell’s Get-ChildItem cmdlet?