Mám sbírku souborů ( *.zip, *.txt, *.tar.gz, *.doc, …atd.). Tyto soubory jsou umístěny v cestě. Chci najít všechny soubory ( *.txt), pak zkopírovat pouze textové soubory, které obsahují konkrétní slova (např. LINUX/UNIX).
Spustil jsem následující:
find . -name "*.txt" | grep 'LINUX/UNIX'
Tento příkaz byl schopen najít všechny textové soubory a poté „grep“ filtroval výsledné textové soubory tak, že vypsal pouze textové soubory, které obsahují „LINUX/UNIX“.
Jak mohu zkopírovat tyto konečné soubory (tj. textové soubory, které obsahují „LINUX/UNIX“) do konkrétní zvolené cesty?
Zkusil jsem použít xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Ale nefungovalo to
Přijatá odpověď:
Zkuste:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest
Protože tento příkaz používá NUL-separation, je bezpečný pro všechny názvy souborů včetně těch s obtížnými názvy, které obsahují mezery, tabulátory nebo dokonce nové řádky.
Výše uvedené vyžaduje GNU cp . Pro MacOS/FreeBSD zkuste:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh
Jak to funguje:
-
grepmožnosti a argumenty-
-rříká grepu, aby prohledával rekurzivně v adresářové struktuře. (Ve FreeBSD,-rbude následovat symbolické odkazy do adresářů. To neplatí pro OS/X ani pro nejnovější verze GNUgrep.) -
--include '*.txt'říká grep, aby vrátil pouze soubory, jejichž názvy odpovídají globu*.txt(včetně skrytých, jako je.foo.txtnebo.txt). -
-lříká grep, aby vrátil pouze názvy odpovídajících souborů, nikoli samotnou shodu. -
--nullříká grep, aby k oddělení názvů souborů používal znaky NUL. (--nullje podporovángreppod GNU/Linux, MacOS a FreeBSD, ale ne OpenBSD.) -
LINUX/UNIXříká grepu, aby hledal pouze soubory, jejichž obsah obsahuje regulární výrazLINUX/UNIX -
.hledat v aktuálním adresáři. V posledních verzích GNUgrepjej můžete vynechat , ale pak budete muset předat--možnost terminátor nacpchránit před názvy souborů, které začínají-.
-
-
xargsmožnosti a argumenty-
-0říká xargs, aby očekával vstup oddělený NUL. -
-rříká xargs, aby příkaz nespouštěl, pokud nebyl nalezen alespoň jeden soubor. (Tato možnost není potřeba na BSD ani OSX a není kompatibilní sxargsOSX .) -
cp -t /path/to/destzkopíruje adresáře do cílového adresáře. (-tvyžaduje GNUcp.)
-