Důvodem je, že v bash
, *
nezahrnuje soubory začínající tečkou (.
).
Můžete běžet
cp A/.* B
Upozorní vás, že nezkopíroval .
nebo ..
, nebo jakékoli podadresáře, ale to je v pořádku.
Nebo, pokud chcete zkopírovat tečkové soubory a normální soubory dohromady, spusťte
cp A/.* A/* B
Můžete také spustit
shopt -s dotglob
cp A/* B
který bude fungovat v bash
, ale ne sh
.
A pokud vám nevadí kopírování podadresářů, pak je to nejjednodušší:
cp -R A/ B
Tip:Pokud někdy zástupné znaky nedělají to, co očekáváte, zkuste je spustit s echo, např.
$ echo A/*
A/file1 A/file2
$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2
$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2
$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
Pokud bash, můžete nastavit dotglob
než zkopírujete
shopt -s dotglob
cp A/* /destination
Nebo programovací jazyk
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Pokud nechcete nastavit dotglob, stačí
cp A/.* /destination 2>/dev/null
To, co hledáte, je více ve smyslu:
cp A/.??* B/
To bude odpovídat všem tečkovým souborům, ale ne "." nebo "..". Většina z výše uvedených řešení je v pořádku, pokud nepracujete rekurzivně. Ale jakmile budete chtít udělat něco jako:
cp -R A/.??* B/
Bez vynechání ".." zkopírujete vše z nadřazeného adresáře dolů, včetně souborů bez teček.