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:
-
grep
možnosti a argumenty-
-r
říká grepu, aby prohledával rekurzivně v adresářové struktuře. (Ve FreeBSD,-r
bude 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.txt
nebo.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. (--null
je podporovángrep
pod 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 GNUgrep
jej můžete vynechat , ale pak budete muset předat--
možnost terminátor nacp
chránit před názvy souborů, které začínají-
.
-
-
xargs
mož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í sxargs
OSX .) -
cp -t /path/to/dest
zkopíruje adresáře do cílového adresáře. (-t
vyžaduje GNUcp
.)
-