あるフォルダのファイル一覧を取得する場合、
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