Vergleichen Sie zwei Verzeichnisse für eine bestimmte Erweiterung und verschieben Sie dann die fehlenden in ein neues Verzeichnis

Vergleichen Sie zwei Verzeichnisse für eine bestimmte Erweiterung und verschieben Sie dann die fehlenden in ein neues Verzeichnis

Bearbeiten und Ändern des Wortlauts, um ihn klarer zu machen - Ich habe .dm4-Dateien in dirA und dirB. Mein Referenzordner ist dirA und ich möchte alle .dm4-Dateien auflisten, die in dirA fehlen und in dirB vorhanden sind und dann alle fehlenden .dm4s zusammen mit den vorhandenen .dm4s von dir A in Verzeichnis C posten, um sicherzustellen, dass ich keine .dm4s übersehe, die in meinem dirA und dirB vorhanden sein könnten.

Antwort1

Lassen Sie uns einige Annahmen festlegen:

  • Ihre Schale istbash
  • DeinVerzeichnis AIstdirA
  • DeinVerzeichnis BIstdirB
  • DeinVerzeichnis Cexistiert noch nicht, wird aber benanntdirC
  • Alle Dateien, die Sie interessieren, existieren in diesen Verzeichnissen oder sind möglicherweise dirAdupliziertdirB

Der einfachste Weg, der mir einfällt, ist folgender:

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

Dadurch werden alle .dm4-Dateien in die beiden Verzeichnisse eingefügt und eine Liste der beiden Verzeichnisse dirCerstellt .diff

Wenn Sie einen höheren Detaillierungsgrad benötigen, bitteBearbeiten Sie Ihre Frageum genauer zu sein.

AKTUALISIEREN:

Angenommen, Sie haben diese Dateien:

$ 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

Beachten Sie, dass einige Dateien dupliziert sind, einige nur in dirA, einige nur in dirB. Keines der Verzeichnisse hat eine cherry.dm4Datei, was auch immer das bedeutet.

Und nehmen wir außerdem an, Sie haben ein Skript 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

Beim Laufen foo.shentstehen:

$ ./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

Die diffAusgabe zeigt, dass die .dm4-Dateien in , , und fehlen dirA. elderberryAlle grapeDateien huckleberryindirA oder dirBsind in vorhanden dirC.

Antwort2

Alle Dateien von dirA nach dirC kopieren

cp dirA/*.dm4 dirC

Kopieren Sie dann alle Dateien aus Verzeichnis B und überspringen Sie vorhandene Dateien in Verzeichnis C.

cp -n dirB/*.dm4 dirC/

Manpage für cp:

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

Hinweis: -nEs werden nur Dateinamen geprüft. Um Versionen zu prüfen, -ukönnte die Option „pdate“ interessant sein.

verwandte Informationen