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