ディレクトリ から何もコピーまたは移動せずに、 ディレクトリ に含まれるファイルを整理してb
、その構造を ディレクトリ の構造a
( と同じファイルが含まれていますがb
、配置方法が異なる) と同じにする方法を探しています。その方法では、次の画像のように、または/およびコマンドからの出力を使用して、 コマンドa
の高度な使用方法を探します。mv
awk
sed
以前のモデル ディレクトリは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
ディレクトリと同じになるはずです。a
a
答え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
に一致するように並べ替えるには、次のようにします。a
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
、それらをターゲット ディレクトリに移動します。 の異なるサブディレクトリにある 2 つのファイルが同じ名前である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