Hi, On Mon, Dec 27, 1999 at 15:30 -0600, khadji@pld.com wrote:
I have a directory, say c:\top, that has sub directories c:\top\001, c:\top\002, etc. I want to run a script from c:\top (mounted as /smb on Linbox) that will go through the subdirectories renaming each file starting with 000001. I have the script written except that it starts with 1 and goes up. I also need the files to retain their extensions so I had forseen something to read the file name, slice the ext off and then reattach it, ie. abcdef.txt=>000001.txt. I am attaching what I have so far. I am making this up as I go with one eye on 'Beginning Linux Programing' from Wrox Press. Thanks for the help. [...] #! /bin/bash
x=000001
for directories in * do if -d $directories
This should be if [ -d "$directories" ]
then for files in $directories/* do if -f $files
if [ -f "$files" ]
then mv $files $x
Enclose the variable names in double quotes. Otherwise your script will fail on filenames with spaces: [sttr]/var/tmp/1> touch "a b" [sttr]/var/tmp/1> ls a b [sttr]/var/tmp/1> for x in *; do mv $x foo; done mv: when moving multiple files, last argument must be a directory [sttr]/var/tmp/1> ls a b [sttr]/var/tmp/1> for x in *; do mv "$x" foo; done [sttr]/var/tmp/1> ls foo
x=$(($x+1)) fi done fi done
Hmm. One problem with your script is that it won't descend into all subdirectories. If you had a directory c:\top\001\001, it would never be visited. To remedy this I'd use find to create a list of all files in the current directory and its subdirectories. #!/bin/sh i=1 for x in $(find . -type f); do mv "$x" "$(dirname $x)/$(printf "%06d" $i)$(echo $x |sed 's#.*\(\.\)#\1#g')" i=$((i+1)) done hould do it. The mv line may look a little tricky but it really isn't. Suppose $x contained ./top/001/abcdef.txt and $i was 5. Then dirname $x would give you the directory name ./top/001. printf "%06d" $i would output 000005. echo $x |sed 's#.*\(\.\)#\1#g' gives you the extenstion .txt. Finally everything is concatenated to ./top/001/000005.txt Ciao, Stefan -- To unsubscribe send e-mail to suse-linux-e-unsubscribe@suse.com For additional commands send e-mail to suse-linux-e-help@suse.com Also check the FAQ at http://www.suse.com/Support/Doku/FAQ/