Navrhuji vám použít rsync místo cp, pokud můžete, má možnost -m, která vyloučí prázdné složky, příklad:
rsync -am <origin> <destination>
Vysvětlení příkazu na stránce explainhell.com
Používám volbu -a, protože dělá spoustu pěkných výchozích akcí, ale pokud chcete, můžete také použít volbu -r, která nastaví pouze rekurzivní režim.
[PŘIDAT komentář]
Nevím o způsobu, jak to udělat pomocí cp, alespoň manuálová stránka nezobrazuje žádnou možnost, která to udělá za vás. Složitější řešení pravděpodobně můžete provést pomocí příkazu find
najít seznam souborů/adresářů ke kopírování a pak jej předat cp, ale to by bylo mnohem složitější než rsync. rsync je dokonce téměř standardní v mnoha linuxech
cp
skutečně nemá možnost získat pouze soubory, ale jak řekl Berserck, můžete použít find
spolu s cp
. Ve skutečnosti je to opravdu jednoduché:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
Nebo:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
Vysvětlení
find
je nástroj, který vyhledá požadované soubory. V první možnosti nastavíme -type f
vrátit pouze běžné soubory. Ve druhé možnosti nastavíme -not -type d
získat vše kromě adresářů. find
provede argumenty předané -execdir
nahrazující {}
s jedním záznamem výsledku najednou a zastaví příkaz, když ;
je nalezen (;
by měl být escapován \;
nebo ";"
nebo by jej shell mohl rozšířit).
-execdir
spustí příkaz s adresářem souboru jako jeho "pracovním adresářem" a je vhodnější místo -exec
, zkontrolujte níže.
-type
dokumentace volitelného příslušenství:
-typ c
Soubor je typu c:
b:blokovat (s vyrovnávací pamětí) speciální
c:znak (bez vyrovnávací paměti) speciální
d:adresář
p:pojmenované potrubí (FIFO)
f:běžný soubor
l:symbolický odkaz; toto nikdy neplatí, pokud je aktivní volba -L nebo -follow, pokud není symbolický odkaz přerušen. Pokud chcete hledat symbolické odkazy, když je aktivní -L, použijte -xtype.
s:zásuvka
D:dveře (Solaris)
-not
dokumentace volitelného příslušenství:
! výraz
True, pokud je výraz nepravdivý. Tato postava bude také obvykle potřebovat ochranu před interpretací pomocí shellu.
-ne výraz
Stejný jako ! expr, ale není kompatibilní s POSIX.
-execdir
dokumentace volitelného příslušenství:
-exec příkaz;
Spusťte příkaz; true, pokud je vrácen stav 0. Všechny následující argumenty k nalezení jsou považovány za argumenty příkazu až do argumentu sestávajícího z ';' se narazí. Řetězec '{}' je nahrazen aktuálním názvem souboru, který se zpracovává všude, kde se vyskytuje v argumentech příkazu [...]. Obě tyto konstrukce může být nutné escapovat (s '\') nebo citovat, aby byly chráněny před expanzí shellem. Zadaný příkaz se spustí jednou pro každý odpovídající soubor. Příkaz se provede v počátečním adresáři. V souvislosti s použitím akce -exec jsou nevyhnutelné bezpečnostní problémy; místo toho byste měli použít volbu -execdir.
-execdir příkaz;
Jako -exec, ale zadaný příkaz se spouští z podadresáře obsahujícího odpovídající soubor , což obvykle není adresář, ve kterém jste začali hledat. Toto je mnohem bezpečnější metoda pro vyvolávání příkazů, protože se vyhne konfliktním podmínkám při řešení cest k odpovídajícím souborům. [...] Pokud použijete tuto volbu, musíte zajistit, aby vaše proměnná prostředí $PATH neodkazovala na '.'; v opačném případě může útočník spustit libovolné příkazy, které se mu zlíbí, ponecháním příslušně pojmenovaného souboru v adresáři, ve kterém spustíte -execdir. Totéž platí pro položky v $PATH, které jsou prázdné nebo které nejsou absolutními názvy adresářů.
https://linux.die.net/man/1/find