To je to, co chcete:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
Rozdělení / vysvětlení tohoto:
find:vyvolání příkazu find.:spuštění vyhledávání z aktuálního pracovního adresáře.- Vzhledem k tomu, že nejsou zadány žádné příznaky hloubky, budou všechny podsložky vyhledány rekurzivně
-name myFile:najít soubory s explicitním názvemmyFile-exec:pro výsledky vyhledávání s nimi provádějte další příkazycp /home/myuser/myFile {}:kopie/home/myuser/myFilepřepíše každý výsledek vrácenýfinddo; vzpomeňte si na{}jako kam směřují jednotlivé výsledky vyhledávání.';':používá se k oddělení různých příkazů, které mají být spuštěny pofind
Existuje několik způsobů, jak to vyřešit, v závislosti na tom, zda se potřebujete starat o soubory s mezerami nebo jinými speciálními znaky v jejich názvech.
Pokud žádný z názvů souborů nemá mezery ani speciální znaky (skládají se pouze z písmen, číslic, pomlček a podtržítek), pak je následující jednoduché řešení, které bude fungovat. Můžete použít $(command) k provedení příkazu a dosadit výsledky do argumentů jiného příkazu. Shell rozdělí výsledek na mezery, tabulátory nebo nové řádky a for přiřaďte každé hodnotě $f postupně a spusťte příkaz pro každou hodnotu.
for f in $(find . -name myFile)
do
cp something $f
done
Pokud máte mezery nebo tabulátory, můžete použít find -exec volba. Předáte -exec command args , zadáním {} kde chcete, aby byl název souboru nahrazen, a zakončení argumentů znakem ; . Musíte uvést {} a ; aby je shell neinterpretoval.
find . -name myFile -exec cp something "{}" \;
Někdy -exec není dostačující. Například v této otázce chtěli použít rozšíření parametrů Bash k výpočtu názvu souboru. Chcete-li to provést, musíte předat -exec bash -c 'your command' , ale pak narazíte na problémy s citováním s {} substituce. Chcete-li to vyřešit, můžete použít -print0 z find vytisknout výsledky oddělené prázdnými znaky (které jsou v názvech souborů neplatné) a přenést je do while read smyčka, která rozděluje parametry na hodnoty null:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
Roura odešle výstup jednoho programu na vstup jiného. cp nečte ze svého vstupního toku na terminálu, pouze používá argumenty na příkazovém řádku.
Buď chcete použít xargs s potrubím nebo find 's exec argument místo potrubí.
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
Poznámka:možnost -I {} definuje {} jako zástupný symbol můžete alternativně použít jiný zástupný symbol, pokud je v konfliktu s příkazem, který se má provést.