ディレクトリb
から何かをコピーしたり移動したりせずに、ディレクトリに含まれるファイルを整理して、その構造をディレクトリの構造と等しくする方法を探していますa
(と同じファイルが含まれていますb
が、異なる方法で配置されています)a
。そのようにして、次の画像のように、または/およびコマンドmv
からの出力でコマンドの高度な使用法を探します。awk
sed
次のようにErrors a
、変更なしでasとitの前にディレクトリをモデル化し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
内容をコピーせずにディレクトリと等しくなるはずです。
簡単にするために、元のデータがディレクトリにあると仮定します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
現在のファイルとして指定されているすべてのファイルを検索し、それらをターゲットディレクトリに移動します。mv -i
の異なるサブディレクトリにある2つのファイルが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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加