作業ログです。たまたま問題を解決できましたが、どうして解決できたのかわからないため、特に得られるものは無いと思います。
やりたいこと
-
Get-ChildItem
を使って、ファイル名でソートされたファイル一覧を取得したい - フォルダ内のフォルダ(サブフォルダ)に入ってるファイルも対象にしたい(再帰)
- サブフォルダにファイルがあれば、フォルダじゃなくてそのファイル名をソートの基準に入れたい
実際に書いたコマンド
> ls -r -file | sort name | Format-Table -property Name
実際に得られる結果
- 画像ファイルはimgフォルダ
- それ以外はすべてカレントフォルダ直下
Name
----
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
index.html
main.css
r1EKnhr.jpg
README.md
記事を書いた動機
仕事で書いていたスクリプトに誤りを見つけたため、その修正した内容を残したく文章に起こしている。
仕事で、下記のようなスクリプトを書いていた。2のファイル名一覧は、事前に叩いたls -r -name -file | sort
の結果をコピペ・整形したものである。
- 複数のフォルダに置かれたpdfを1つのフォルダにすべてコピーする
- 指定ファイルに書かれたファイル名一覧のとおりに、1のpdfをリネームする
上記を実行すると、想定してた組み合わせでのリネームが実施できなかった。「タコ足配線.pdf」を「takoashi.pdf」にリネームしたかったのに、「ikasumi.pdf」になっていた。ファイルを移動する前におこなったls -r -name -file | sort
の結果取得できたファイル名の順番と、移動後のファイル名一覧の順番が違っていたからだ。
スクリプトを修正する前に起きていた問題
どういう内容のスクリプトか
まず、ls -r -name -file | sort
を実施する。そこで得たファイル一覧から、フォルダ名をすべてのぞいて、純粋にファイル名だけのリストを作成する。
imgs\1408293437773.jpg
imgs\DroJj4rVAAMVcN9.jpg
imgs\FH000037.jpg
imgs\IMG00508.jpg
imgs\IMG00508.webp
imgs\r1EKnhr.jpg
index.html
README.md
style\main.css
上の一覧からフォルダ名をのぞいたのが下記一覧である。
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
r1EKnhr.jpg
index.html
README.md
main.css
複数フォルダに置かれていたファイルを1つに移したあと、このファイルリストを上から順に読み取って、Rename-Item
を実行する。これがスクリプトの全容である。
ファイルを一つのフォルダに移したあとにlsを実行した結果
スクリプトがうまくいかないことがわかって、確認のためにファイルを1つのフォルダに移したあと、ls | sort
を実行してみた。
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
index.html
main.css
r1EKnhr.jpg
README.md
順番が違っていた。。
ls -r | sort
だと、ソートの起点がコマンドを実行したディレクトリになる。photoフォルダの中に画像が入っているような構成だと、画像名に1234.pngなどがあっても、index.htmlより前に結果が表示されることは無い。
なぜかFormat-Tableをかませるとファイルを起点にしたソートができた
ここで、最初に書いたスクリプトに戻るのだが、結果的に下記コマンドでやりたいことが実現できた。パイプラインを使って、オブジェクトを渡せるのは知っているが、なぜFormat-Tableのあとにsortじゃないんだろうか。それならなんとなく納得でき…ないけども。
> ls -r -file | sort name | Format-Table -property Name
おわりに
解決したいことを実現するために、いろいろ検索したが、検索ワードがうまく思いつかず徒労に終わった。以下にどういうワードで検索したかを載せておこうとおもう。
- powershell get-childitem -r ファイル名 起点
- powershell get-childitem recurse ファイル並び替え
- powershell get-childitem ファイル起点 フォルダ並び替え