GNU/Linux >> Znalost Linux >  >> Linux

Jak použít příkaz 'cp' k vyloučení konkrétního adresáře?

Proč používat rsync když můžete:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

To předpokládá, že struktura cílového adresáře je stejná jako struktura zdroje.


cp -r `ls -A | grep -v "c"` $HOME/

Pokud by vyloučení určitých vzorů názvů muselo být prováděno každou unixovou souborovou utilitou (jako cp, mv, rm, tar, rsync, scp, ...), došlo by k obrovskému zdvojení úsilí. Místo toho lze takové věci dělat jako součást globbingu, tj. pomocí vašeho shellu.

bash

man 1 bash , / extglob .

Příklad:

$ shopt -s extglob
$ echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png

Takže stačí vložit vzorek dovnitř !() a to neguje shodu. Vzor může být libovolně složitý, počínaje výčtem jednotlivých cest (jak ukazuje Vanwaril v jiné odpovědi):!(filename1|path2|etc3) , k věcem podobným regulárnímu výrazu s hvězdami a třídami postav. Podrobnosti naleznete v manuálové stránce.

zsh

man 1 zshexpn , / generování názvu souboru .

Můžete udělat setopt KSH_GLOB a používat bash-jako vzory. Nebo,

% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

Takže x~y odpovídá vzoru x , ale nezahrnuje vzor y . Ještě jednou, úplné podrobnosti viz manuálová stránka.

ryby

Rybí skořápka má na to mnohem hezčí odpověď:

🐟 cp (string match -v '*.excluded.names' -- srcdir/*) destdir

Bonusový pro-tip

Zadejte cp * , stiskněte Ctrl X * a uvidíš, co se stane.


rsync je rychlý a snadný:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

Můžete použít --exclude vícekrát.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

Všimněte si, že adresář thefoldertoexclude po --exclude možnost je relativní k sourcefolder , tj. sourcefolder/thefoldertoexclude .

Můžete také přidat -n pro suchý běh, abyste viděli, co se zkopíruje před provedením skutečné operace, a pokud je vše v pořádku, odstraňte -n z příkazového řádku.


Linux
  1. [Linux] :Jak vyloučit adresář při použití příkazu shellu „tar“.

  2. Linuxový příkaz rsync:jak jej používat

  3. Jak vyloučit adresář v find . příkaz

  1. Jak používat příkaz Linux Rsync (vzdálená synchronizace).

  2. Jak použít příkaz 'mv' k přesunutí souborů kromě souborů v konkrétním adresáři?

  3. Jak používat regex s příkazem find?

  1. Jak používat Su Command v Linuxu

  2. Jak vyloučit konkrétní adresáře z kopírování v Linuxu

  3. Jak naplánovat příkaz Rsync?