複数のフォルダを次のような構造に整列したいと思います。
たとえば、
/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」を削除してください。