2017-02-09 3 views
0

Warum nicht auch rm -fR folderpath/* Ordnerpfad löschen. Wie ich es verstehe Wildcard a* bedeutet a oder a plus eine beliebige Anzahl von Zeichen. Also bedeutet folderpath/*folderpath/ und folderpath/ plus irgendein Zeichen. Daher sollte der Befehl auch rm -fR folderpath/ ausführen, was dazu führen sollte, dass auch der Ordnerpfad gelöscht wird.Die Verwendung von Platzhalter wie Ordnerpfad/* stimmt nicht mit Ordnerpfad/überein. Warum?

+0

Der Platzhalter in diesem Fall ist "Shell Globbing", wobei '*' allem entspricht, _aber nicht ** nichts ** _ - es ist nicht wie '*' in regulären Ausdrücken, die "Null oder mehr" entsprechen ... Der Shell-Glob '*' stimmt nicht mit _zero_ überein. –

+0

Die Pfadnamenerweiterung funktioniert etwas anders als die Mustererkennung. – chepner

+1

@StephenP Das stimmt nicht ganz. 'foo * bar' würde' foobar' entsprechen. – chepner

Antwort

0

Da Sie nur löschen, was im Ordnerpfad ist, bedeutet das "/".

Verwenden

rm -rf folderpath 

, wenn Sie es alles weg wollen.

+0

Ich weiß das.Ich will nur wissen warum? Weil rm-fR folderpath/löscht den ganzen Ordner.Warum verhält sich die Wildcard anders für rm? – christoph

1

Dies ist, weil die Shell versucht, Ihre Platzhalter zu erweitern. Versuchen Sie es mit ls.

Angenommen, Sie haben einen Ordner aaa mit zwei Unterordner bbb1 und und jeder von ihnen enthält die Dateien ccc1 und ccc2. Würde wie folgt aussehen:

└── aaa 
    ├── bbb1 
    │   ├── ccc1 
    │   └── ccc2 
    └── bbb2 
     ├── ccc1 
     └── ccc2 

wir schaffen sie für die Prüfung:

mkdir -p aaa/bbb{1,2} 
touch aaa/bbb{1,2}/ccc{1,2} 

nun versuchen, was die folgenden Befehle zeigen:

ls aaa  # first 
ls aaa/  # second 
ls aaa/*  # third 

Der erste Befehl zeigt Ihnen den Inhalt des aaa , das sind die Ordner bbb1 und . Der zweite Befehl macht dasselbe.

Aber der dritte Befehl expandiert nach

ls aaa/bbb1 aaa/bbb2 

Ja, und es zeigt Sie die Inhalte von bbb1 und erwarten mögen, die beiden Male sind die Dateien ccc1 und ccc2.

Was ich zeigen wollte: Ihre Shell die * mit allen Dateien (oder Ordner) in das Verzeichnis gegeben ersetzt (da alle Dateien und Ordner Namen übereinstimmen) und ersetzt die Zeichenfolge aaa/* von aaa/bbb1 aaa/bbb2. Aber es tut nicht zu erweitern, denn das würde die /* wegnehmen.

1

Die Dokumentation ist in diesem Punkt nicht eindeutig, aber die Pfadnamenerweiterung unterscheidet sich geringfügig von der normalen Mustererkennung. Sobald Sie eine / übereinstimmen, müssen Sie mindestens einen Eintrag im Verzeichnis übereinstimmen, bevor das Muster als Ganzes als übereinstimmend betrachtet werden kann. Obwohl das Muster /foo/* dem String/foo/ entspricht, entspricht es nicht dem Pfad/foo/.

Eine mögliche Interpretation ist, dass /foo/*Dateien in /foo/ ist passend, und wenn es keine Dateien sind, schlägt das Spiel.Ich möchte diese Interpretation besser aber, wenn

shopt -s dotglob 
ls /foo/* 

/foo/. und /foo/.. abgestimmt.

Vielleicht ist der richtige Weg, um darüber nachzudenken, dass Pfadname Expansion eine / separierten Folge von Mustern betrachtet, von denen jede etwas für das Muster als Ganzes übereinstimmen müssen übereinstimmen.

Verwandte Themen