GNU/Linux >> Linux Esercitazione >  >> Linux

Usando sia il nome di base che il percorso completo in find -exec

prova qualcosa del genere :

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

Per vedere cosa succede quando esegui la ricerca, digita semplicemente set -xv
-x :stampa i comandi e i relativi argomenti mentre vengono eseguiti.
-v :Stampa le righe di input della shell mentre vengono lette.

Ecco cosa ho :

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

Fornisce l'output:

./log.xml
./svnLog.xml

E quando provo :

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

Ottengo :

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

E poi find execute echo passando il nome del file trovato invece del letterale :'{}'

ma quando aggiungi qualcosa al {} come sotto :

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

Qui l'eco viene eseguito due volte per i 2 file xml che ho e poiché non c'è più '{}' è l'elenco dei parametri di exec, non verrà sostituito. quindi abbiamo ottenuto il echo 'something{}' per ogni file trovato.

Per far fronte a ciò, puoi pensare di eseguire echo passandogli il nome del file come parametro come ad esempio :

sh -xvc 'echo sothing/$0' filename

Sappiamo già cos'è -x e -v . -c è ottenere il comando dalla stringa che lo segue (man sh )

quindi il risultato è :

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

Ho usato 'echo somthing/$0 ' tra '' in modo che $0 non venga espanso dalla shell corrente. provalo con " " e vedrai l'espansione di $0;)

Quindi, per tornare al tuo "problema", la ricerca dovrebbe essere formattata come segue:

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

E otterremo :

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

Come possiamo vedere, find eseguirà la shell cammand echo sothing/$0 passandogli '{}' (sostituito dal nome file trovato da find) quindi otteniamo il echo sothing/./log.xml desiderato

set +xv per rimuovere la modalità dettagliata e possiamo ottenere :

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

quindi nel tuo caso devi solo eseguire la copia in una sub shell (aggiungi sh o bash o preferisci la shell dopo exec) e let find passa il nome del file come parapetto all'it;)

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

Spero che questo possa essere d'aiuto e mi giustizi per il mio inglese.


Da man find:"-execdir primary è identico a -exec primary con l'eccezione che l'utilità verrà eseguita dalla directory che contiene il file corrente. Il nome file sostituito dalla stringa ``{}'' non è qualificato."

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

Linux
  1. Utilizzo di sed per trovare e sostituire file di testo in Linux

  2. Usare "sed" per trovare e sostituire?

  3. Utilizzo di grep e sed per trovare e sostituire una stringa

  4. trova e rimuovi i file con spazio usando il comando trova su Linux

  5. come trovare il percorso HADOOP_HOME su Linux?

Trovare file eseguibili usando ls e grep

Come usare / (separatore di directory) sia in Linux che in Windows in Python?

Elenca il file usando il comando ls in Linux con percorso completo

Systemd:utilizzo sia di After che di Requires

Rimozione di file con rm utilizzando find e xargs

Come posso cercare un file per nome e percorso parziale?