ディレクトリ(およびすべてのサブファイル/ディレクトリ)を移動しながら項目をアルファベット順に移動するにはどうすればよいですか?

ディレクトリ(およびすべてのサブファイル/ディレクトリ)を移動しながら項目をアルファベット順に移動するにはどうすればよいですか?

次のコマンドを実行するとき:

mv -v foo /mnt/bar

ディレクトリfooとすべてのサブコンテンツがこのディレクトリに移動されます/mnt/bar。ファイルの移動順序は次のとおりです。目次注文する( ls -U)。

同じことをしながら、サブファイル/ディレクトリをfooアルファベット順に移動する良い方法はありますか?

find -exec mv子コンテンツをアルファベット順に繰り返すために使用できることはわかっていますが、ターゲットで同じサブディレクトリ構造を維持するには、いくつかの面倒な作業が必要です。 GNUにフラグがあったらと思いますが、mvマニュアルページには役に立つものはありません。

答え1

$ \ls foo | xargs -I% mv -v foo/% bar
'foo/one' -> 'bar/one'
'foo/sie' -> 'bar/sie'
'foo/two' -> 'bar/two'
'foo/uve' -> 'bar/uve'
'foo/wox' -> 'bar/wox'
'foo/zanzibar' -> 'bar/zanzibar' 
  1. ls項目をアルファベット順にリストするために使用されます。純粋に実行されていることを確認するにはls(.bashrcまたは.bash_aliasesに隠されたエイリアスとして追加された追加の文字なし)、コマンドを.bashrcまたは.bash_aliasesとして実行します\ls
  2. ls次に出力を送信xargs
  3. 各項目に変数とともに変数名を指定します-I(これはmvコマンドで「表示」できる情報を提供します)
  4. アイテム(と呼ばれる%)をその場所からfoo新しいターゲットに移動します。

答え2

サポート対象:zshpax-0

printf '%s\0' foo foo/**/*(D) | pax -0rwdv /mnt/bar/ && rm -rf foo

これらの再帰グローブは各レベルで語彙的にソートされます(ロケールの照合順序を使用)。a前にa/a前に…a/bb

find foo -print0 | sort -zフルパスの並べ替えとは異なります。たとえば、次のようになります。

a
a/b
a/b.c
a/b/c

代わりに、Cロケールでは次の順序で進みます。

a
a/b
a/b/c
a/b.c

zshグループを形成します。

関連情報