同じ構造のフォルダ内で複数のファイルを移動する

同じ構造のフォルダ内で複数のファイルを移動する

私が作業しているプロジェクトには、最初にアセットというディレクトリがあります。このディレクトリには、予測不能な名前を持つ多数のディレクトリがあり、各ディレクトリには同じ名前が含まれていますが、内容には他の多くのファイルが含まれています。私の元のファイル構造は次のとおりです。

assets
|
|-some_dir
|  |-blue.txt
|  |-apple.txt
|  |-red.txt
|  |-banana.txt
|
|-some_other_dir
|  |-blue.txt
|  |-apple.txt
|  |-red.txt
|  |-banana.txt
...
|-yet_another_dir
|  |-blue.txt
|  |-apple.txt
|  |-red.txt
|  |-banana.txt

明らかに、ファイルとディレクトリには正確な名前がありません。私はファイルが同じディレクトリに残りますが、このディレクトリ内の他のディレクトリに配置される新しいファイル構造を導入したいと思います。私の考えでは:

assets
|
|-some_dir
|  |-colors
|  |  |-blue.txt
|  |  |-red.txt
|  |-fruits
|  |  |-apple.txt
|  |  |-banana.txt
|
|-some_other_dir
|  |-colors
|  |  |-blue.txt
|  |  |-red.txt
|  |-fruits
|  |  |-apple.txt
|  |  |-banana.txt
...
|-yet_another_dir
|  |-colors
|  |  |-blue.txt
|  |  |-red.txt
|  |-fruits
|  |  |-apple.txt
|  |  |-banana.txt

アセットにはディレクトリが多すぎるため、各ディレクトリを手動で参照することはオプションではないため、1つのディレクトリまたは少なくとも少数のシェルコマンド(私はzshを使用しています)を使用してこれを実行したいと思います。

reply を使用して、各ディレクトリにサブディレクトリを作成できます。この問題ただし、各ファイルは既に存在するディレクトリ内のディレクトリにのみ移動できることを念頭に置いて、ファイルを新しいディレクトリに移動する方法がわかりません。

編集:まだ明確ではないので、各ファイルを個別に(名前で)移動して正しい順序で並べ替えたいのですが(ディレクトリごとにいくつかのファイルしかありません)、個々のディレクトリごとにこれを繰り返すことはありません。

答え1

それは次のとおりです。

autoload -U zmv
mkdir-and-mv() {
  mkdir -p -- "$2:h" &&
    mv -- "$@"
}

typeset -A c
c=(
  blue   colors
  red    colors
  apple  fruits
  banana fruits
)

zmv -n -P mkdir-and-mv "(**/)((${(j:|:)${(@bk)c}}).txt)" '$1$c[$3]/$2'

-n満足すればテスト実行のために削除)

関連情報