it-swarm-eu.dev

dávat grep výstup do rm

Snažím se přenést grep výstup na rm, ale vydává zbytečné věci. Je pro rm vyžadován nějaký přepínač? Nebo lze rm poskytnout regexp přímo?

ls | grep '^\[Daruchini'| rm

rm: chybějící operand Zkuste `rm --help 'pro více informací.

50
CodeBladeRunner

Musíte použít xargs, abyste změnili standardní vstup na argumenty pro rm.

$ ls | grep '^Dar' | xargs rm

(Dejte si pozor na speciální znaky v názvech souborů; s GNU grep, můžete dávat přednost

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Ačkoli Shell nepoužívá regexps, je to jednoduchý vzor:

$ rm Dar*

(Mezitím si myslím, že potřebuji více spánku.)

61
geekosaur

Neprovádějte analýzu výstupu ls .

Zde je velmi snadné přimět prostředí, aby filtrovalo požadované soubory. Všimněte si, že právě Shell rozšiřuje vzor Dar*, nikoli příkaz rm. Rozšíření vzoru prováděné Shell se nazývá globbing .

rm Dar*

Ve složitějších případech vyhledejte příkaz find.

Pokud chcete omezit výstup grep raději novými řádky než mezerami, můžete to určit pomocí xargs přes -d možnost.

$ ls | grep '^Dar' | xargs -d '\n' rm

(jak je popsáno v this question)

3
mherzl

Pro předávání výstupu jako argumentu mám tendenci používat smyčku while, protože nejsem obeznámen s xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;
2
Mitms

Na Catalině 10.15.3, se zsh, jsem zjistil, jak se vypořádat s novými řádky a bílými prostory:

 Sudo find / | grep -i 'yourString' | tr '\n' '\0' | xargs -0 -n1 rm -r 

Jinými slovy, přeložením nových řádků bez mezery (tr\n až\0) před odstraněním pomocí "rm -0".

Také vždy používám 'find' + 'grep -i', protože 'find -iname' někdy nevysílá nic.

Poslední poznámka: najde a odstraní soubory a složky, které odpovídají 'yourString'. Pouze pro soubory zadejte "find -type f" a potom volba "-r" pro rm je zbytečná.

0
YvUh

Nejlepší příkaz pro mě je:

find ./Daruchini* -exec rm {}\;
0
Bodale