將目錄 b 及其子目錄檔案組織為與目錄 a 相同,而不從目錄 a 複製或移動

將目錄 b 及其子目錄檔案組織為與目錄 a 相同,而不從目錄 a 複製或移動

我正在尋找某種方法來組織目錄中包含的文件b,使其結構等於目錄的結構a(其中包含與目錄相同的文件b,只是以不同的方式排列),而不是從目錄複製或移動任何內容a。透過這種方式,可以透過or/and命令mv的輸出來尋求命令的一些高階用法,如下圖所示。awksed

模型目錄之前的 asErrors a和 it 沒有修改,as 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應該變得等於目錄a而不複製目錄a內容。

答案1

查找、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匹配的層次結構,而不從toa複製任何內容:ab

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目前檔案的每個檔案並將它們移至目標目錄;mv -i在覆蓋之前詢問,以避免在不同子目錄中的兩個檔案碰巧b具有相同名稱的情況下丟失資料。

然後,您可能想要刪除不在下列位置的常規檔案或目錄b(例如d3在我們的範例中)a

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

相關內容