GNU/Linux >> Znalost Linux >  >> Linux

Grep Word v souboru a pak zkopírujte soubor?

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:

  1. 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 GNU grep .)

    • --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án grep pod GNU/Linux, MacOS a FreeBSD, ale ne OpenBSD.)

    • LINUX/UNIX říká grepu, aby hledal pouze soubory, jejichž obsah obsahuje regulární výraz LINUX/UNIX

    • . hledat v aktuálním adresáři. V posledních verzích GNU grep jej můžete vynechat , ale pak budete muset předat -- možnost terminátor na cp chránit před názvy souborů, které začínají - .

  2. 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í s xargs OSX .)

    • cp -t /path/to/dest zkopíruje adresáře do cílového adresáře. (-t vyžaduje GNU cp .)


Linux
  1. Ansible Guide:Správa souborů pomocí Ansible

  2. Extrahovat soubory do souboru Exe?

  3. Nejlepší nástroje pro přenos souborů v systému Linux

  1. Zkopírujte soubory v terminálu Linux

  2. Vyhledání nejdelšího slova v textovém souboru

  3. Zkopírujte obsah souboru do schránky v terminálu Linux

  1. Přesunout soubory v terminálu Linux

  2. Jak zvýraznit slovo ve výstupu „kočka“?

  3. Grep pro více řetězců v souborech a pak seznam souborů v pořadí velikosti?