(2 risposte)
Chiuso 11 mesi fa.
Sembra che "trova", "bash" e "sed" in alcuni casi non funzionino come ci si aspetta.
L'esempio seguente dovrebbe prima creare il file "sample.txt", quindi trovare il file e infine elaborarlo con il comando "-exec". Il comando eseguito stampa il nome del file trovato, i campioni di prova e il nome del file modificato. Il comando 'sed' stesso viene utilizzato per sostituire 'txt' in 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
L'output previsto è:
./sample.txt Campione_prima.TXT ./campione.TXT Campione_dopo.TXT
Invece produce:
./sample.txt Campione_prima.TXT ./campione.txt Campione_dopo.TXT
(l'esempio è stato testato anche con la sostituzione dei comandi della vecchia scuola tramite virgolette "`" con lo stesso risultato)
Cosa sbaglio?
Risposta accettata:
La sostituzione del comando viene eseguita prima di find
anche inizia. Il comando effettivo eseguito (dopo sostituzioni, espansioni e rimozioni di preventivi ecc.) è
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Se devi eseguire qualsiasi cosa fantasia (pipe o comandi multipli) con -exec
, quindi avvia una shell separata per farlo:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'