2012-04-03 3 views
3

Ich verwende den folgenden Befehl, um geänderte Dateien manchmal zu löschen, wenn Sie hg verwenden.Escape-Pipe-Ausgabe zwischen Befehlen

hg status -n | xargs rm 

Ich habe über ein Problem kommen, wo, wenn die Ausgabe von

hg status -n 

alle Dateipfade mit Leerzeichen in der Datei enthält, wird nicht gefunden werden. Normalerweise würde ich Leerzeichen in Dateinamen quotieren oder es lassen, aber ich bin nicht sicher, wie man das mit piped Ausgabe tut. Jede Hilfe wäre super danke :)

+0

Hat eine dieser Antworten helfen? – Mikel

+0

ja danke, habe deine Antwort unter – Dori

Antwort

4

Sagen beide Befehle NUL als Trennzeichen zu verwenden:

hg status -n0 | xargs -0 rm 

auch vorsichtig sein: die -n Die Option druckt sogar Dateien, über die Mercurial nichts weiß.

Vielleicht möchten Sie dies stattdessen?

hg status -mn0 | xargs -0 rm 

Vergessen Sie auch nicht über hg revert oder hg purge. Vielleicht tun sie, was Sie wollen, z.

hg revert --all --no-backup 

oder

.hgrc

[extensions] 
hgext.purge= 

Schale

hg purge 
+0

+1 NUL ist der Dateitrenner der Wahl für Leute, die keine Überraschungen wollen. – l0b0

+0

+1 mit NUL als Trennzeichen funktioniert super danke! Manchmal finde ich es nützlich, ein 'grep' hinein zu werfen und eine Teilmenge von Dateien zu löschen - sagen wir, wenn ich versehentlich eine Ladung von *** erstellt habe. Orig ** zum Beispiel - weshalb' revert' oder 'purge' nicht Passen Sie meinen Zweck (Blick auf 'hg help revert' ich sehe, ich könnte' -I'. Nun, jetzt habe ich zwei Möglichkeiten, etwas zu tun, und ich lernte etwas Neues!) – Dori

+0

Siehe 'grep -z' für, wie null zu filtern- begrenzte Ausgabe. – Mikel

2

Ich habe keine hg installiert. Also werde ich es tun mit ls:

$ touch 'file A' 'file B' 

$ ls -1 
file A 
file B 

$ ls | xargs rm 
rm: cannot remove `file': No such file or directory 
rm: cannot remove `A': No such file or directory 
rm: cannot remove `file': No such file or directory 
rm: cannot remove `B': No such file or directory 

$ ls | tr '\n' '\0' | xargs -0 rm 

$ ls 
+0

akzeptiert scheint nicht zu funktionieren. Gibt immer noch einen Fehler aufgrund eines nicht-maskierten Pfades an ** rm: Ordnername/Test: Keine solche Datei oder kein Verzeichnis ** – Dori

+0

Was gibt 'hg status -n' zurück? – kev

+0

Ich teste es nur, wenn ich 'ls' verwende – kev

1

Let xargs handhaben, dass mit der -I Option:

hg status -n | xargs -I FileName rm FileName 

-I die Sicherheit erhöht, sondern reduziert auch die Effizienz, da nur ein Dateiname zu einem Zeitpunkt übergeben wird zu 'rm'

Ein Beispiel:

$ printf "%s\n" one "2 two" "three 3 3" | xargs printf "%s\n" 
one 
2 
two 
three 
3 
3 


$ printf "%s\n" one "2 two" "three 3 3" | xargs -I X printf "%s\n" X 
one 
2 two 
three 3 3 
0

Neben -0, neuere xargs hat Option -d, die Sie tun, solche Dinge helfen:

<command returning \n-separated paths> | xargs -d \\n rm -v