Windows linux PowerShell

【Linux】【Windows】ファイル一覧取得方法

あるフォルダのファイル一覧を取得する場合、
linuxコマンドではgrepを使えばいいのですが、Windowsの場合はどう使えばいいのかわからなかったのでメモ

フォルダ階層イメージ

test
│  test1.txt
│
├─folder1
│  │  test11.txt
│  │  test12.txt
│  │
│  └─folder11
│          test111.txt
│
└─folder2
        test21.txt

相対パスで取得

linux

linuxの場合、findで取得できます。


find ./ -type f
./folder1/folder11/test111.txt
./folder1/test11.txt
./folder1/test12.txt
./folder2/test21.txt
./test1.txt

Windows

Windowsの場合、PowerShellの「Get-ChildItem」を使えばfindと同じように使えます。

ただし、findと違い、「./」は表示されません。


Get-ChildItem ./ -Recurse -Name
folder1
folder2
test1.txt
folder1\folder11
folder1\test11.txt
folder1\test12.txt
folder1\folder11\test111.txt
folder2\test21.txt

PowerShellのコマンドは省略して書くことができます。Linuxに慣れてるとこっちのほうが書きすいかもです。


gci -r -n ./
folder1
folder2
test1.txt
folder1\folder11
folder1\test11.txt
folder1\test12.txt
folder1\folder11\test111.txt
folder2\test21.txt

絶対パスで取得

Linux

findのパス指定を絶対パスにすると出力結果も絶対パスになります。


find /mnt/c/test -type f
/mnt/c/test/folder1/folder11/test111.txt
/mnt/c/test/folder1/test11.txt
/mnt/c/test/folder1/test12.txt
/mnt/c/test/folder2/test21.txt
/mnt/c/test/test1.txt

findの相対パスからでも絶対パスで出力させたい場合は、pwdを使えばいけます。


find `pwd` -type f
/mnt/c/test/folder1/folder11/test111.txt
/mnt/c/test/folder1/test11.txt
/mnt/c/test/folder1/test12.txt
/mnt/c/test/folder2/test21.txt
/mnt/c/test/test1.txt

「-type f」⇒「-type d」にしたらディレクトリ一覧
「-type f」を取り除いたらファイル+ディレクトリ一覧になります。

Windows

Windowsもフルパスで取得する場合はいくつか取得方法があります。

Format-Table

Format-Table(省略:ft)を使うことでフルパスの取得ができます。
前後に改行が出力されるので改行不要な場合、トリミング等の処理が別途必要になります。


gci -r|Where-object {$_ -is [System.IO.FileInfo]}|ft -a FullName -HideTableHeader
C:\test\test1.txt
C:\test\folder1\test11.txt
C:\test\folder1\test12.txt
C:\test\folder1\folder11\test111.txt
C:\test\folder2\test21.txt

Select-Object

Select-Object(省略:select)を使うことでフルパスの取得ができます。
Format-Tableとは違い上下の改行は出力されません。


gci -r|Where-object {$_ -is [System.IO.FileInfo]}|select -Expandproperty FullName
C:\test\test1.txt
C:\test\folder1\test11.txt
C:\test\folder1\test12.txt
C:\test\folder1\folder11\test111.txt
C:\test\folder2\test21.txt

フォルダ名のみ出力する方法

真ん中の「Where-object {$_ -is [System.IO.FileInfo]}」を「Where-object {$_ -is [System.IO.DirectoryInfo]}」に変更するとフォルダ名も出力します。


gci -r|Where-object {$_ -is [System.IO.DirectoryInfo]}|select -Expandproperty FullName
C:\test\folder1
C:\test\folder2

フォルダ名も出力す方法

真ん中の「Where-object {$_ -is [System.IO.FileInfo]}」を「?{$_.Length -ne $null}」に変更するとフォルダ名も出力します。


gci -r ./| ?{$_.Length -ne $null}| select -ExpandProperty FullName
C:\test\folder1
C:\test\folder2
C:\test\test1.txt
C:\test\folder1\folder11
C:\test\folder1\test11.txt
C:\test\folder1\test12.txt
C:\test\folder1\folder11\test111.txt
C:\test\folder2\test21.txt

ファイル名のみの取得

Linux

Linuxの場合、find+basenameを使うことでファイル名のみ取得することができます。
ただし、パイプラインのみで繋ぐことができない為、xargsコマンドで橋渡しします。


find ./ -type f | xargs -I {} basename {}
test111.txt
test11.txt
test12.txt
test21.txt
test1.txt

「-type f」⇒「-type d」にしたらディレクトリ一覧
「-type f」を取り除いたらファイル+ディレクトリ一覧になります。

Windows

フルパス取得時に記載したコマンドから「FullName」⇒「Name」に書き換えるだけです。

Format-Table

Format-Table(省略:ft)を使うことでフルパスの取得ができます。


gci -r|Where-object {$_ -is [System.IO.FileInfo]}|ft -a Name -HideTableHeader
test1.txt
test11.txt
test12.txt
test111.txt
test21.txt

Select-Object

Select-Object(省略:select)を使うことでフルパスの取得ができます。


gci -r|Where-object {$_ -is [System.IO.FileInfo]}|select -Expandproperty Name
test1.txt
test11.txt
test12.txt
test111.txt
test21.txt

フォルダ名のみ出力する方法

真ん中の「Where-object {$_ -is [System.IO.FileInfo]}」を「Where-object {$_ -is [System.IO.DirectoryInfo]}」に変更するとフォルダ名も出力されます。


gci -r|Where-object {$_ -is [System.IO.DirectoryInfo]}|select -Expandproperty Name
folder1
folder2
folder11

フォルダ名も出力す方法

真ん中の「Where-object {$_ -is [System.IO.FileInfo]}」を「?{$_.Length -ne $null}」に変更するとフォルダ名も出力されます。


gci -r ./| ?{$_.Length -ne $null}| select -ExpandProperty Name
folder1
folder2
test1.txt
folder11
test11.txt
test12.txt
test111.txt
test21.txt

-Windows, linux, PowerShell
-, , ,