0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Get-ChildItemに-rオプションをつけても、ファイル名を起点に並び替えする

Last updated at Posted at 2022-05-01

作業ログです。たまたま問題を解決できましたが、どうして解決できたのかわからないため、特に得られるものは無いと思います。

やりたいこと

  • 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の結果をコピペ・整形したものである。

  1. 複数のフォルダに置かれたpdfを1つのフォルダにすべてコピーする
  2. 指定ファイルに書かれたファイル名一覧のとおりに、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 ファイル起点 フォルダ並び替え
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?