サブディレクトリを見つけて新しい親ディレクトリに再構成する

サブディレクトリを見つけて新しい親ディレクトリに再構成する

次のフォルダ構造があります。

/Folder1/Folder2/output/0653/3547/0112945601/ 
/Folder1/Folder2/output/0653/3547/0112945602/

5番目のサブフォルダのみが変更されました。

5番目のサブフォルダをすべて一覧表示し、次のように再構成したいと思います。

/Folder1/Folder2/output01/0653/3547/0112945601/
/Folder1/Folder2/output02/0653/3547/0112945602/ 
/Folder1/Folder2/output03/0653/3547/0112945603/ 
...
/Folder1/Folder2/output<nn>/0653/3547/01129456<nn>/ 

10個のサブフォルダがある場合、このロジックによれば10個の出力フォルダが必要です。

使ってみよう

find -maxdepth 5 -type d 

whileループに入れましたが、5番目のサブフォルダだけを処理することはできません。

私は何ができると思いますか?

答え1

for dir in Folder1/Folder2/output/*/*/*; do
    suffix=${dir:(-2)}
    subdir="$(cut -d '/' -f 4- <<<$dir)"
    newdir="Folder1/Folder2/output${suffix}/${subdir}"
    echo mkdir -p "$newdir"
    echo mv "$dir"/* "$newdir"/
done

練習を実行した後に自分に合ったコマンドを生成するように見える場合は、ドアを削除してecho実際にファイルを移動してください。

答え2

現在のディレクトリにあるとしますFolder1

#!/bin/bash

# Don't even attempt to do something
# if we're in the wrong place.
cd Folder1/Folder2 || exit 1

# Make the shell remove patterns that aren't matched,
# rather than leaving them as they are.
shopt -s nullglob

for dirpath in output/*/*/*/; do
        if [[ $dirpath =~ output/(.*)/[^/]*(..)/ ]]; then
                # "${BASH_REMATCH[1]}" is something like "0653/3457"
                # "${BASH_REMATCH[2]}" is the 2-character suffix, like "01"

                newdir=output${BASH_REMATCH[2]}/${BASH_REMATCH[1]}
                mkdir -p "$newdir" &&
                mv "$dirpath" "$newdir"
        fi
done

これは、正規表現の一致を使用してbashディレクトリパス名の末尾から数字のサフィックスを選択し、outputそれを使用して新しいディレクトリ名を設定します。

これはディレクトリ構造をとる

.
`-- Folder1/
    `-- Folder2/
        `-- output/
            `-- 0653/
                `-- 3547/
                    |-- 0112945601/
                    `-- 0112945602/

そしてそれを

.
`-- Folder1/
    `-- Folder2/
        |-- output/
        |   `-- 0653/
        |       `-- 3547/
        |-- output01/
        |   `-- 0653/
        |       `-- 3547/
        |           `-- 0112945601/
        `-- output02/
            `-- 0653/
                `-- 3547/
                    `-- 0112945602/

Folder1/Folder2/outputその後、次のように空のディレクトリを削除できます。

find Folder1/Folder2/output -type d -empty -delete

findまたは、空でないディレクトリを削除しようとするときは、標準を使用してエラーを無視してください。rmdir

find Folder1/Folder2/output -depth -type d -exec rmdir {} \; 2>/dev/null

これは去る

.
`-- Folder1/
    `-- Folder2/
        |-- output01/
        |   `-- 0653/
        |       `-- 3547/
        |           `-- 0112945601/
        `-- output02/
            `-- 0653/
                `-- 3547/
                    `-- 0112945602/

確かにそこにいるんだコピーまずあなたのデータです。

答え3

#!/usr/bin/env bash
PATH="/folder1/folder2/folder3"
HIERARQUIA=$(/usr/bin/find $PATH/????/????/  -maxdepth 0 -type d | /usr/bin/cut -d "/" -f5-|/usr/bin/sort -s )
OUTPUT=1

for i in $HIERARQUIA
    do
        SUBPASTAS=$(/usr/bin/find $PATH/$i -maxdepth 1 -type d | /usr/bin/cut -d "/" -f7 |/usr/bin/sort -s)
        for a in $SUBPASTAS
            do
                /usr/bin/mkdir -p $PATH/output$OUTPUT/$i$a
                /usr/bin/mv $PATH/$i$a/* $PATH/output$OUTPUT/$i$a
                OUTPUT=$(($OUTPUT +1))              
            done
            OUTPUT=1
    done

私はこの結果を見つけ、その目的に合致しました。いつか同様の問題が発生しているすべての人のためにここにコードがあります。

答えて助けてくれた皆さんに感謝します。

関連情報