Solved

execute command recursively in subdirs

Posted on 2002-04-11
11
641 Views
Last Modified: 2012-06-21
How can I rename alle files named "*.x" to "*.y" in all subdirs?

I'm looking for a general solution!
I know mmv - but I don't know, if I could use it here.

a solution would be a command that executes the same command in every subdir ...

so I would call:
run_rec mmv "*.x" "#1.y"

thanks
michi
0
Comment
Question by:witty
  • 4
  • 4
  • 2
  • +1
11 Comments
 
LVL 51

Expert Comment

by:ahoffmann
ID: 6933465
find ./ -name "*.x" | xargs -i basename {} ".x" | xargs -i mv {}.x {}.y
# or a more UNIXisch solution
find ./ -name \*.x | sed -e 's/\(.*\)\.x/mv & \1.y/'|sh
0
 
LVL 1

Author Comment

by:witty
ID: 6933701
well, this is exactly, what I do all the time - but there must exist some better solution - more related to recursivity!!!

thanks
witty
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 6934117
KISS - keep it small and simple

why do you warry about the find command? It does exactly what you asked for, not more and not less, exactly.
This with just a few key hits, if you do it recursively you need a script/program with a few hundred bytes. Why?
Find still is recursively, somehow.
An d with a simple  -type f  you can restrict to files. What do you need more?
0
 
LVL 1

Author Comment

by:witty
ID: 6934833
I know what you mean - but there MUST exist something without "find -exec" or "xargs"!

nevertheless your command-line wouldn't work (the pwd doesn't change) :-)

thanks
michi
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 6934901
> .. MUST exist ..
well, replace find by
    ls -lR
but it's slower, not as flexible etc. etc.
Still do not understand why you need to make things more complicated.

> .. your command-line wouldn't work ..
which did not work?
what did not work?
what is the problem?
both work for me since years, 1'st one only if there is a basename, 2'nd on any UNIX I've ever seen
Keep in mind, that depending on your shell you need to quote parameters and/or escape some special charactzers.

> ..(the pwd doesn't change)
true. Why should it change? There is no reason for it (it just wastes time, or think of directories which a links:)

I gave you 2 perfect solutions to your question, either accept them or give a detailled description with example what you want to do.
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 1

Author Comment

by:witty
ID: 6935088
ok - why the first line doesn't work:

"basename" is the name without directory.
so the "mv"-command can't work, because it won't find a file with this name in the current directory (because it is in a subdir!)!

and why I don't like it:
xargs is sooo slow, if you have a lot of (and I mean A LOT OF) files!!!

thanks though
michi
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 6935109
agree, basename is not for recursive use, sorry didn't test again.
Did you try my 2'nd example? Probably, depending on shell and/or sed version, needs to be changed to:
  find ./ -name \*.x | sed -e 's#\(.*\)\.x#mv & \1.y#'|sh
0
 
LVL 16

Expert Comment

by:The--Captain
ID: 6949423
This may be easier to understand - always works for me

find -name "*.x" | sed -n -e 's/^\(.*\)\.x$/\1/p' | awk '{print "mv -f " $0 ".x " $0 ".y"}' | sh -x

-Jon
0
 
LVL 1

Author Comment

by:witty
ID: 6950111
First of all: thanks to all your comments!

BUT:
these solution are all specific ones - the same I use today!!
(as you can read in my question) I'm looking for a *general solution* to do something like:
run_rec command -options parameters

thanks again
michi
0
 
LVL 16

Accepted Solution

by:
The--Captain earned 50 total points
ID: 6950224
I think I know what you're saying - you want to just be able to run a cmdline within each directory recursively?

Why not:


#!/bin/bash
find -type d | awk "{print \"export STCD=`pwd` ; cd \" \$0 \" ; $1 ; cd $STCD\"}" | sh -x

Just use the first argument as the command to run and it will run it in every directory recursively - don't forget the quotes if your cmdline has spaces in it...

I called the script rec_cmd and typed:

rec_cmd "touch 'my balls'"

and 'my balls' appeared in every directory recursively...

-Jon

0
 

Expert Comment

by:CleanupPing
ID: 9089092
witty:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1
EXPERTS:
Post your closing recommendations!  No comment means you don't care.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Currently, there is not an RPM package available under the RHEL/Fedora/CentOS distributions that gives you a quick and easy way to allow PHP to interface with Oracle. As a result, I have included a set of instructions on how to do this with minimal …
Little introduction about CP: CP is a command on linux that use to copy files and folder from one location to another location. Example usage of CP as follow: cp /myfoder /pathto/destination/folder/ cp abc.tar.gz /pathto/destination/folder/ab…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
Connecting to an Amazon Linux EC2 Instance from Windows Using PuTTY.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now