特定の拡張子の 2 つのディレクトリを比較し、不足しているものを新しいディレクトリに移動する

特定の拡張子の 2 つのディレクトリを比較し、不足しているものを新しいディレクトリに移動する

より明確にするために言葉を編集し変更します - dirA と dirB の両方に .dm4 ファイルがあります。参照フォルダーは dirA で、dirA にはないが dirB にはあるすべての .dm4 ファイルをリストし、不足しているすべての .dm4 と dir A の既存の .dm4 をディレクトリ C に投稿して、dirA と dirB に存在する可能性のある .dm4 を見逃さないようにしたいと考えています。

答え1

いくつかの仮定を立ててみましょう:

  • あなたの殻はbash
  • あなたのディレクトリAdirA
  • あなたのディレクトリBdirB
  • あなたのディレクトリCまだ存在しないが、名前が付けられる予定dirC
  • 関心のあるファイルはすべてこれらのディレクトリに存在するdirAか、または重複している可能性がありますdirB

私が考えられる最も簡単な方法は次のとおりです。

rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)

これにより、すべての .dm4 ファイルが2 つのディレクトリに保存されdirC、そのリストが生成されます。diff

それ以上の詳細が必要な場合は、質問を編集するもう少し詳しく言うと。

アップデート:

次のファイルがあるとします:

$ ls -1 dir{A,B}/*
dirA/apple.dm4
dirA/banana.dm4
dirA/date.dm4
dirA/fig.dm4
dirB/apple.dm4
dirB/elderberry.dm4
dirB/fig.dm4
dirB/grape.dm4
dirB/huckleberry.dm4

一部のファイルは重複しており、一部は にのみ存在しdirA、一部は にのみ存在することに注意してくださいdirB。どちらのディレクトリにもcherry.dm4ファイルはありません。

また、スクリプト foo.sh があるとします。

$ cat << EOF > foo.sh; chmod 755 foo.sh
#!/usr/bin/env bash
rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)
EOF

実行するとfoo.sh次のものが生成されます:

$ ./foo.sh
2,3c2
< banana.dm4
< date.dm4
---
> elderberry.dm4
4a4,5
> grape.dm4
> huckleberry.dm4
$ ls -1 dirC/*
dirC/apple.dm4
dirC/banana.dm4
dirC/date.dm4
dirC/elderberry.dm4
dirC/fig.dm4
dirC/grape.dm4
dirC/huckleberry.dm4

出力には、 、 、の.dm4 ファイルが欠落しているdiffことがわかります。dirAelderberrygrapehuckleberrydirA または dirBは に存在しますdirC

答え2

dirA のすべてのファイルを dirC にコピーします

cp dirA/*.dm4 dirC

次に、dirCの既存のファイルをスキップして、dirBからすべてのファイルをコピーします。

cp -n dirB/*.dm4 dirC/

マニュアルページcp:

  -n, --no-clobber
         do not overwrite an existing file (overrides a previous -i
          option)

注:-nファイル名のみをチェックします。バージョンをチェックするには、-update オプションが役立つ場合があります。

関連情報