4

I tried this bash command:

find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled

But the second {} is not executed.

It results in just ./index_disabled instead.

How can I use the found parameter twice in the execute command?

rubo77
  • 2,282
  • 3
  • 32
  • 63

3 Answers3

5

Your problem is not that it's not interpreted twice, as doing

find . -type f -exec echo {} {} \;

will show. The problem is that {} can't be used as an argument to a function, as you're trying to. In my (limited) experience, if you want to get clever with find and the contents of {}, you'll need to write a shell script that is invoked from find, that takes {} as its one and only argument, and that does the clever things inside that script.

Here's an example clever script:

[me@risby tmp]$ cat /tmp/clever.sh 
#!/bin/bash
echo $1 $(dirname $1)/index_disabled

Here's me using it with find, and the last few lines of the results:

[me@risby tmp]$ find . -type f -exec /tmp/clever.sh {} \;
[...]
./YubiPAM-1.1-beta1/stamp-h1 ./YubiPAM-1.1-beta1/index_disabled
./YubiPAM-1.1-beta1/depcomp ./YubiPAM-1.1-beta1/index_disabled
./YubiPAM-1.1-beta1/INSTALL ./YubiPAM-1.1-beta1/index_disabled

As you can see, if I replaced echo in the shellscript with mv, I'd get the desired result.

MadHatter
  • 78,442
  • 20
  • 178
  • 229
  • thanks, that solved my problem. But how could I solve this without having to write an extra shell script? for the next time ;) – rubo77 Apr 17 '13 at 12:00
  • 3
    Beats me; I run into this problem seldom enough that I take the "noddy shell script" route when I do. It also has the handy advantage that, by using `echo` in place of the real function, **you can check what it's going to do before running it for real**, thus avoiding the sort of "*I just blew away 375 important files, I have no backups, how do I undelete*" question that gets asked depressingly often around these parts. – MadHatter Apr 17 '13 at 12:30
2

You'll have to use the xargs command and a little trick:

$ find /var/www/ -path '*wp-admin/index.php' | xargs -i sh -c 'mv {} $(dirname {})/index_disabled'
Spack
  • 1,594
  • 13
  • 22
2

You could use a simple for loop to solve this.

for f in $(find /var/www/ -path '*wp-admin/index.php'); do mv $f $(dirname $f)/index_disabled; done
hairlessbear
  • 136
  • 2