2016-09-01 2 views
2

Ich versuche, Dateien aus /Dir1 zu löschen, die nicht in /Dir2 existieren. Das Problem ist, dass die ersten paar Zeichen übereinstimmen, aber nicht die letzten. Beispielsweise.Datei löschen, wenn Endzeichen nicht übereinstimmen

/Dir1 
abc_def.png 
xyz_xyz.png 

/Dir2 
abc_ghi.png 

So lange, wie „abc“ Streichhölzer, ich will nicht die Datei löschen, obwohl die letzten Zeichen unterschiedlich sind. Die einzige Datei, die ich löschen möchte, ist xyz.png, weil sie nicht in /Dir2 existiert. Wie würde ich das machen?

+2

Was wäre, wenn '/ Dir2' stattdessen die Datei' ghi_abc.png' hätte? Würde 'abc_def.png' in'/Dir1' nicht gelöscht? –

+0

Richtig, es würde nicht gelöscht werden. Ich möchte, dass es von den ersten drei Zeichen abhängig ist. – kkd92

+0

Sie meinen den ersten Teil des Dateinamens vor dem Unterstrich für Dateien in '/ Dir1'? –

Antwort

1

Vorausgesetzt, dass Sie einen Teil des Dateinamens übereinstimmen soll vor dem ersten Unterstrich (wie in Ihrem Beispiel), können Sie diesen Code verwenden:

cd /Dir1 

for f in *_*; do 
    [[ -f /Dir2/"${f%%_*}"* ]] || echo rm "$f" 
done 

Sobald feststeht, entfernen echo vor rm.

+0

Was bedeutet "d %%"? Ist das wie ein Platzhalter für was auch immer die Charaktere sind? – kkd92

+0

'$ {f %% _ *}' entfernt den längsten Teil nach dem ersten Unterstrich von '$ f' – anubhava

+0

Nein, das endete mit dem Echo aller Dateien. – kkd92

Verwandte Themen