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/myFile
přepíše každý výsledek vrácenýfind
do; 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.