GNU/Linux >> Znalost Linux >  >> Linux

Jak používáte regulární výrazy s příkazem cp v Linuxu?

Ne.

cp příkaz nemá schopnost zpracovat žádný ze svých argumentů jako regulární výrazy. Dokonce ani zástupné znaky nezpracovává (nebo většina spustitelných souborů); spíše je ovládá shell.

cp test/* test2/ je ve skutečnosti rozšířen o bash a to vše cp opravdu vidí, že jeho argumenty jsou cp test/file1 test/file2 test/file3 test2/ (nebo cokoli, co je vhodné na základě skutečného obsahu test/ ).

Také si nemyslím, že váš výraz, [^\.php] , bude odpovídat tomu, co chcete (neodpovídá pouze souborům, které obsahují .php ).

Pravděpodobně se budete chtít podívat do find k odfiltrování seznamu souborů na základě regulárního výrazu a poté použijte xargs aplikujte vrácený seznam souborů na cp příkaz find (předpokládám, že find nemá vestavěný obslužný program pro kopírování souborů; tento nástroj důvěrně neznám).

Můžete zkusit:

find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;

To říká, že se má v aktuálním adresáři rekurzivně vyhledat soubory, které v cestě neobsahují ".php" a zkopírovat je do /destination/folder/ .

Jak bylo požadováno, specifičtější rozdělení argumentů:

  • . - Místo pro zahájení vyhledávání – v tomto případě aktuální adresář
  • ! - Operátor "Ne", invertujte výsledek dalšího testu
  • -iregex - Test regulárního výrazu bez rozlišení velkých a malých písmen. Dalším argumentem je výraz.
  • ".*\.php.*" - Regulární výraz odpovídající <Anything>.php<Anything> - Jakýkoli soubor, který má někde v cestě ".php". (Poznámka, včetně umístění ve složce, která obsahuje v názvu „.php“, budete potřebovat složitější výraz, aby odpovídal pouze souborům)
  • -exec - Proveďte příkaz, pokud předchozí testy vrátí hodnotu true. Dalším argumentem je příkaz, všechny zbývající argumenty až do ; jsou předány příkazu. {} je speciální argument představující název souboru.
  • cp - Příkaz, který find` by měl běžet na každém z odpovídajících názvů cest.
  • {} - Cesta k nalezenému souboru předaná na cp jako argument, aby věděl, jaký soubor zkopírovat
  • /destination/folder/ - argument předán do cp , oznamující cp kam má soubor zkopírovat.
  • \; - Toto je ; terminátor, který -exec hledá. Escape to pomocí \ aby se to váš shell nepokoušel analyzovat a místo toho to uvedl jako argument příkazu (find )

Je poměrně obtížné napsat regulární výraz, který odpovídá "řetězcům, které nemají .php ", takže místo toho řekneme find k vyhledání řetězců, které dělají obsahovat .php a poté invertujte výsledky pomocí ! .


Můžete použít několik dalších nástrojů z konzole, jako jsou grep a xargs.

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

Linux
  1. Jak používat Linuxový příkaz grep

  2. Jak používat příkaz historie v Linuxu

  3. Jak používat příkaz id v Linuxu

  1. Jak používat příkaz su v Linuxu s příklady

  2. Jak používat w Command v Linuxu s příklady

  3. Jak používat příkaz „screen“ v Linuxu

  1. Jak používat příkaz k hodinkám Linux s příklady

  2. Jak používat příkaz historie Linuxu

  3. Jak používat příkaz xargs pro Linux