It looks like 'find', 'bash' and 'sed' in some cases does not work as one expects.
The following example should first create file 'sample.txt', then find the file and finally process it by '-exec' command. The executed command prints found filename, test specimens, and modified filename. The 'sed' command itself is used to replace 'txt' to 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;
The expected output is:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Instead it produces:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(the example has been tested also with old-school command substitution through backquotes '`' with the same result)
What am I doing wrong?
The command substitution is executed before find
even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec
, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt' \
-exec sh -c 'printf "%s " "$1"; printf "%s %s %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments