Používáme příkaz cp v Linuxu ke kopírování souborů a adresářů z jednoho adresáře do druhého. Lze jej jednoduše použít ke zkopírování několika souborů nebo adresářů nebo jej lze použít s '-r'
argument (což znamená „rekurzivní ‘), chcete-li zkopírovat adresář a celou adresářovou stromovou strukturu pod ním.
Syntaxe, která se má použít pro příkaz cp je:
$ cp <file1> <file2> ... <fileN> <target_directory> $ cp -r <directory1> <directory2> ... <directoryN> <target_directory> $ cp file1 file2 file3 /tmp
Pokud se má zkopírovat velký počet souborů, lze je zadat pomocí zástupných znaků; pokud jsou pojmenovány v sekvenčním vzoru (např. název_souboru_1 , název_souboru_2 , atd.) nebo pokud existuje velký počet souborů stejné přípony (např. .mp4
).
$ cp *.txt /tmp $ cp file_* /tmp
příkaz cp může tedy mít libovolný počet argumentů, což jsou buď soubory, adresáře nebo obojí. Posledním argumentem je cílový adresář, do kterého mají být zkopírovány.
Kopírování velkého počtu souborů:Chyba „Seznam argumentů je příliš dlouhý“
Zatímco teoreticky „cp ‘ může mít co nejvíce argumentů, existuje předdefinovaný limit na maximální počet argumentů, se kterými může pracovat jeden příkaz. Toto je limit definovaný v systému Linux a je založen na velikosti zásobníku systému.
Pokud je tedy zadán velmi vysoký počet souborů se zástupným znakem „cp ‘, Např. přes sto tisíc souborů, vyhodí chybu:„Seznam argumentů je příliš dlouhý “.
Například, jak je znázorněno na obrázku níže, složka obsahuje 100002 soubory. Pokud tedy spustíme příkaz copy, zobrazí se výše uvedená chyba a všechny soubory budou se zástupným znakem.
$ ls -l | wc -l $ cp file_* target/
Řešení:Pomocí příkazu „Najít“ opravte chybu „Příliš dlouhý seznam argumentů“
K vyřešení tohoto problému používáme příkaz najít , který v podstatě vyhledává soubory v adresářích na základě různých parametrů. Spouštíme „najít ‘ ve stejném adresáři jako soubory, které chceme zkopírovat.
Potom použijeme '-exec'
parametr „najít ‘ což vám umožní spustit jakýkoli příkaz nad výstupem find.
$ find . -maxdepth 1 -name "<filename_pattern>" -exec cp {} <target_directory> \;
Zde je první argument, '.'
(aktuální adresář) je adresář, kde najdete soubory. Argument '-maxdepth 1'
bere v úvahu pouze soubory a adresáře v aktuálním adresáři. Bez zadání této hloubky „najít ‘ příkaz bude zbytečně prohledávat všechny podadresáře.
Argument "-name"
a řetězec za tím určuje výraz, pomocí kterého lze vypsat požadované soubory. Poté zadáme „cp ‘ příkaz za argumentem '-exec'
. Otevřené závorky, '{ }'
jsou zástupným symbolem pro argument, který má být použit z výstupu find.
$ find . -maxdepth 1 -name "file_*" -exec cp {} target/ \;
Vidíme, že soubory byly úspěšně zkopírovány do '/target'
.
$ cd target/ $ ls | head -10 $ ls -l | wc -l
Podobně, pokud existují adresáře, které mají být zkopírovány spolu se soubory, spustíme ‘cp ‘ s '-r'
příznak v příkladu níže.
$ find . -maxdepth 1 -name "file_*" -exec cp -r {} target/ \;
Pamatujte, že v takovém případě by měl být název adresáře možné prohledávat také pomocí „vzoru názvu souboru ‘.
Související čtení :Jak přesunout velké množství souborů v Linuxu
Závěr
V tomto článku jsme viděli, jak zkopírovat velké množství souborů z jednoho adresáře do druhého v Linuxu a jak tedy obejít problém „Seznam argumentů je příliš dlouhý ‘.
Pokud máte nějakou zpětnou vazbu nebo dotazy, dejte nám vědět v komentářích níže!