ディレクトリ b とそのサブディレクトリのファイルをディレクトリ a からコピーまたは移動せずにディレクトリ a と同じに整理します。

ディレクトリ b とそのサブディレクトリのファイルをディレクトリ a からコピーまたは移動せずにディレクトリ a と同じに整理します。

ディレクトリ から何もコピーまたは移動せずに、 ディレクトリ に含まれるファイルを整理してb、その構造を ディレクトリ の構造a( と同じファイルが含まれていますがb、配置方法が異なる) と同じにする方法を探しています。その方法では、次の画像のように、または/およびコマンドからの出力を使用して、 コマンドaの高度な使用方法を探します。mvawksed

以前のモデル ディレクトリはErrors a、変更なしで次のように表示されますErrors b

.                                       .
└── Errors a                            └── Errors b
    ├── Eltendorf                           ├── Eltendorf
    │   ├── 2013 March 09.txt               │   ├── 2013 March 09.txt
    │   ├── 2014 November 07.txt            │   ├── 2014 November 07.txt
    │   ├── 2016 August 03.txt              │   ├── 2016 August 03.txt
    │   └── 2017 October 02.txt             │   └── 2017 October 02.txt
    ├── Gettendorf                          ├── Gettendorf
    │   ├── 2011 August 05.txt              │   ├── 2011 August 05.txt
    │   ├── 2014 October 02.txt             │   ├── 2014 October 02.txt
    │   ├── 2014 October 09.txt             │   ├── 2014 October 09.txt
    │   └── 2015 November 08.txt            │   └── 2015 November 08.txt
    ├── Krensdorf                           ├── Krensdorf
    │   ├── 2010 August 04.txt              │   ├── 2010 August 04.txt
    │   ├── 2010 November 04.txt            │   ├── 2010 November 04.txt
    │   └── 2012 August 09.txt              │   └── 2012 August 09.txt
    └── Ritzing                             └── Ritzing
        ├── 2013 March 01.txt                   ├── 2013 March 01.txt
        ├── 2013 March 02.txt                   ├── 2013 March 02.txt
        ├── 2013 March 03.txt                   ├── 2013 March 03.txt
        └── 2018 November 02.txt                └── 2018 November 02.txt

Errors c必要に応じて、前後のコンテンツ ディレクトリを次のように指定しますErrors d

.                                       .
└── Errors c                            └── Errors d
    ├── Eltendorf                           ├── Eltendorf
    │   ├── 2010 November 04.txt            │   ├── 2013 March 09.txt
    │   ├── 2013 March 02.txt               │   ├── 2014 November 07.txt
    │   ├── 2014 November 07.txt            │   ├── 2016 August 03.txt
    │   └── 2014 October 09.txt             │   └── 2017 October 02.txt
    ├── Gettendorf                          ├── Gettendorf
    │   ├── 2012 August 09.txt              │   ├── 2011 August 05.txt
    │   ├── 2013 March 03.txt               │   ├── 2014 October 02.txt
    │   ├── 2014 October 02.txt             │   ├── 2014 October 09.txt
    │   └── 2017 October 02.txt             │   └── 2015 November 08.txt
    ├── Krensdorf                           ├── Krensdorf
    │   ├── 2010 August 04.txt              │   ├── 2010 August 04.txt
    │   ├── 2013 March 01.txt               │   ├── 2010 November 04.txt
    │   ├── 2015 November 08.txt            │   └── 2012 August 09.txt
    │   └── 2018 November 02.txt            └── Ritzing
    └── Ritzing                                 ├── 2013 March 01.txt
        ├── 2011 August 05.txt                  ├── 2013 March 02.txt
        ├── 2013 March 09.txt                   ├── 2013 March 03.txt
        └── 2016 August 03.txt                  └── 2018 November 02.txt

そうすれば、ディレクトリの内容をコピーしなくても、ディレクトリはcディレクトリと同じになるはずです。aa

答え1

find、sed、xargs、mkdir:

find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}

答え2

簡単にするために、元のデータがディレクトリにあると仮定しますa

a
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

bと同じファイルを含むディレクトリがありa、異なるディレクトリ構造で整理されているとします。

b
├── d1
│   └── f3
├── d2
│   ├── f1
│   └── f2
└── d3
    └── f4

からに何もコピーせずに のファイルをの階層bに一致するように並べ替えるには、次のようにします。aab

export orig=a dest=b
find "$orig" -type f -exec sh -c '
    for file; do
        target=$dest${file#$orig}
        target=${target%/*}
        mkdir -p -- "$target"
        find "$dest" -type f -name "${file##*/}" \
            -exec mv -i -- \{\} "$target/" \;
    done
    ' mysh {} +

このコードはあまり効率的ではありません (find内のファイルごとに新しいプロセスを生成しますa)。

  • 内のすべての通常ファイルを検索しますa
  • ターゲットディレクトリをファイルの親ディレクトリとして定義し、aを に置き換えます。b
  • ターゲットディレクトリを作成します(makedir -p既存のディレクトリについてはエラーを出さず、必要な親もすべて作成します)。
  • 現在のディレクトリと同じ名前のすべてのファイルを検索しb、それらをターゲット ディレクトリに移動します。 の異なるサブディレクトリにある 2 つのファイルが同じ名前であるmv -i場合にデータが失われるのを防ぐため、上書きする前に確認します。b

次に、に含まれていない通常のファイルまたはディレクトリb(この例のように)を削除する必要がある場合があります。d3a

export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
    target=$orig${1#$dest}
    [ ! -e "$target" ]
    ' mysh {} \; -delete

最終結果は次のとおりです。

b
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

関連情報