it-swarm-eu.dev

Jak zkopírovat některé, ale ne všechny soubory?

Takže můžete použít * jako zástupná karta pro všechny soubory při použití cp v kontextu adresáře. Existuje způsob, jak zkopírovat všechny soubory kromě souboru x?

59
Chad Harrison

V bash můžete použít extglob:

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

kde !(b*) vyloučí všechny soubory b*.

Později můžete extglob deaktivovat pomocí

 $ shopt -u extglob
46
rush

Rsync to zvládne pěkně.

Příklad kopírovat vše: rsync -aP /folder1/* /folder/2

Příklad kopie s vyloučením: rsync -aP --exclude=x /folder1/* /folder2/

The -aP přepínač:

a: Podobné jako cp -a, rekurzivní atd. P: Ukazuje pokrok, pěkný rys rsync.

54
Tim

Toto není funkce cp, je to funkce vašeho Shell (rozšiřuje * znamenat všechny soubory bez teček), takže odpověď závisí na tom, kterou Shell používáte. Například zsh podporuje tuto syntaxi:

$ cp ^x /path/to/destination

Kde ^x znamená „všechny soubory kromě x

Můžete také kombinovat vzory výběru a zrušení výběru, např. Chcete-li zkopírovat všechny soubory wav s výjimkou těch, které obsahují xyz, můžete použít:

cp *.wav~*xyz*
12
Michael Mrozek

Mohlo by to být také provedeno v obyčejné staré (přenosné/kompatibilní) bourne Shell různými způsoby se standardními nástroji mnohem méně elegantním způsobem, než pomocí pokročilých globálních Shell nebo příkazů s vestavěnými možnostmi vyloučení.

Pokud není příliš mnoho souborů (a ne s názvy včetně mezer a/nebo zlomů řádků), může to být způsob:

cp `ls | egrep -v '^excludename$'` destdir/.

Jistě, nástroje bash a GNU= jsou skvělé a výkonné nástroje, ale stále nejsou vždy k dispozici. Pokud jej chcete vložit do přenosného skriptu, doporučil bych find jako v komentáři od Rush.

4
MattBianco

Pokud chcete zkopírovat vše ve složce (včetně podsložek) do konkrétního podadresáře:

cp -R $(ls | grep -v '^subdir$') subdir/

Pracuje s sh, bash, zsh (alespoň).

2
user2707671