MV サブディレクトリは 1 レベル上ですが、ルートディレクトリまでではありません。

MV サブディレクトリは 1 レベル上ですが、ルートディレクトリまでではありません。

複数のフォルダを次のような構造に整列したいと思います。

たとえば、

/root/sub1/aaaa/bbbb/cccc/dddd
/root/sub2/aaaa/bbbb/cccc/dddd
/root/sub3/aaaa/bbbb/cccc/dddd
/root/sub4/aaaa/bbbb/cccc/dddd

これは、次のフォルダ以外には何も含めない入れ子になったフォルダです。

この道を断りたい

/root/sub1/dddd
/root/sub2/dddd
/root/sub3/dddd
/root/sub4/dddd

フォルダをルートレベルのフォルダに移動するのではなく、親フォルダのすぐ下に移動したいと思います。

実行するのに最適なコマンドは次のとおりです。

mv sub*/aaaa/bbbb/cccc/dddd

しかし、これを行うと、すべてがルートレベルに戻ります。

あるいは、各サブフォルダでコマンドを実行することもできますが、それでも退屈です。

mv aaaa/bbbb/cccc/dddd

答え1

ファイルは異なるディレクトリに存在する必要があるため、このタスクをmv複数回実行する必要があり、各ターゲットディレクトリに対して少なくとも1回は実行する必要があります。以下を実行してmvこれを実行できます。forループ

for x in /root/*
do
  mv -i "$x"/*/*/*/* "$x"
done

mvディレクトリ内の各項目に対して、ループ(コマンド)の本文を順番に実行します。/rootループ本体が実行されるたびに"$x"パスに置き換えられます/root/subN。このコマンドは、ファイルが移動されたディレクトリにmv -i "$x"/*/*/*/* "$x"ファイルを移動します。/root/sub1/aaaa/bbbb/cccc/dddd/root/sub1/root/sub1/dddd

オプションを使用すると、ターゲットファイルがすでに存在するかどうかを尋ねられます。これはとが-iある場合にmv発生する可能性があります。/root/sub1/aaa1/bbb/ccc/ddd/root/sub1/aaa2/bbb/ccc/ddd

答え2

find /root -maxdepth 6 -mindepth 6 -type d | awk -F \/ '{ print "mv "$0" "$1"/"$2"/"$3"/"$6 }' | sh

最大ディレクトリと最小ディレクトリの深さに特に焦点を当てて、findコマンドを使用してからリストを取得し、awkを介して解析してshを使用して実行できるmvコマンドを作成します。テスト用の実行を追加する前に「|sh」を削除してください。

関連情報