GNU/Linux >> Znalost Linux >  >> Linux

Použití základního názvu a úplné cesty v find -exec

zkuste něco takového :

find  /home/mine -iname "*.png" -printf "%P\n " | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy% 

Chcete-li vidět, co se děje při spuštění hledání, stačí napsat set -xv
-x :Tiskne příkazy a jejich argumenty při jejich provádění.
-v :Tiskne vstupní řádky shellu při jejich čtení.

Tady je to, co mám:

find . -name "*.xml" -exec echo {} \;

Dává výstup:

./log.xml
./svnLog.xml

A když to zkusím :

set -xv
find . -name "*.xml" -exec echo {} \;

Chápu :

find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml

A pak najděte provést echo, které předá nalezený název souboru místo písmena:'{}'

ale když přidáte něco do {} jako níže:

find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}

Zde se echo provede dvakrát pro 2 xml soubory, které mám, a protože již není '{}' je seznam parametrů exec, nebude nahrazen. takže máme echo 'something{}' pro každý nalezený soubor.

Chcete-li se s tím vypořádat, můžete přemýšlet o provedení echo, které mu předá název souboru jako parametr, jako například:

sh -xvc 'echo sothing/$0' filename

Již víme, co je -x a -v . -c je získat příkaz z řetězce za ním (man sh )

takže výsledek je:

sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename

Použil jsem 'echo somthing/$0 ' mezi ' ', aby se $0 nerozbalilo aktuálním shellem. zkuste to s " " a uvidíte rozšíření o $0;)

Abychom se vrátili k vašemu „problému“, měl by být nález ve formátu níže:

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;

A dostaneme :

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml

Jak vidíme, nález spustí příkaz shellu echo sothing/$0 předá mu '{}' (nahrazeno názvem souboru nalezeným funkcí find), takže dostaneme požadovaný echo sothing/./log.xml

set +xv pro odstranění podrobného režimu a můžeme získat:

find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml

takže ve vašem případě stačí provést kopii v sub shellu (přidejte sh nebo bash nebo preferujete shell po exec) a nechte find předat název souboru jako parapet do it;)

find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

Doufám, že vám to pomůže a omluvte mě za mou angličtinu.


Z man find:"Primární -execdir je identický s primárním -exec s tou výjimkou, že obslužný program bude spuštěn z adresáře, který obsahuje aktuální soubor. Název souboru nahrazený řetězcem ``{}'' není kvalifikovaný."

find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

Linux
  1. Použití grep a sed k nalezení a nahrazení řetězce

  2. najít a odstranit soubory s mezerou pomocí příkazu find v Linuxu

  3. jak najít cestu HADOOP_HOME na Linuxu?

  1. Odstranění souborů pomocí rm pomocí find a xargs

  2. Použití find a tar se soubory se speciálními znaky v názvu

  3. Jak mohu provést více příkazů při použití funkce find?

  1. Použití sed k nalezení a nahrazení textových souborů v Linuxu

  2. Pomocí „sed“ najít a nahradit?

  3. najít a zkopírovat soubor pomocí Bash