フォルダ内のすべてのファイルを同じ名前のサブディレクトリに移動するにはどうすればよいですか?

フォルダ内のすべてのファイルを同じ名前のサブディレクトリに移動するにはどうすればよいですか?

ディレクトリに複数のファイルがあるとしましょう。

filename-1.ext1
filename-1.ext2
filename-1.ext3
filename-2.ext1
filename-2.ext2
filename-2.ext3
filename-3.ext1
filename-3.ext2
filename-3.ext3

次に、ファイルと同じ名前(ファイル名はありますが拡張子はありません)を使用して同じディレクトリにサブディレクトリを作成し、次のように移動したいと思います。

filename-1
├──filename-1.ext1
├──filename-1.ext2
└──filename-1.ext3
filename-2
├──filename-2.ext1
├──filename-2.ext2
└──filename-2.ext3
filename-3
├──filename-3.ext1
├──filename-3.ext2
└──filename-3.ext3

この目標を達成する最も効率的な方法は何ですか?

編集:ext1、ext2、ext3は、.foo、.bar、.top、.coffeeなどの3つの異なるファイル名を意味します。ファイル名が似ているわけではありません。

ベストアンサー1

を使用しているので、zsh次のように実行できます。

for name (*.ext<->(.)) mkdir -p -- $name:r && mv -- $name $name:r 

または、よりおなじみの長いループ形式を使用してくださいfor

for name in *.ext<->(.); do
    mkdir -p -- $name:r &&
    mv -- $name $name:r
done

*.ext<->これは、任意の数のパターンに一致するすべての一般的なファイルを繰り返します。これは通常のファイルのみを一致させるように強制するglob修飾子です<->。ドットを含む一般ファイルのファイル名と一致させるには、パターン全体を(.)に変更します。*.*(.)後でファイル拡張子を削除するには、ドットが必要です。緩いパターンよりも厳しいパターンを使用するには、次のものを使用してくださいfilename-<->.ext<->(.)。このパターンを使用するには、文字列で始まる名前を一致させたいかどうかを知る必要がありますfilename-

拡張は$name:rと同じ値を生成します$nameが、拡張は除外されます(つまり、値の「ルート」のみ)。

これを使用して、両方のオプション--にオプションの終わりを通知し、ダッシュで始まるmkdir名前 mvがオプションとして誤認されるのを防ぎます。

おすすめ記事