![](https://seccdn.libravatar.org/avatar/b695a96a72a63b262751b9e46de91727.jpg?s=120&d=mm&r=g)
----- Original Message ----- From: Patrick K Moorman <khadji@pld.com> To: Stefan Troeger <stefan.troeger@wirtschaft.tu-chemnitz.de> Sent: Tuesday, December 28, 1999 12:30 AM Subject: Re: [SLE] Shell Programing
I finally got to the Linbox and when I run the script I get an error:
sed: -e expression #1, char14: Unmatched ( or \(
so I try " ... | sed 's#.*\(\\)\#\1#g' added a " \ " after " ) " then I get this error:
sed: -e expression #1, char15: Unterminated 's' command
at this point I have exhasted my knowledge and the man, info, --help for sed doesn't help.
----- Original Message ----- From: Stefan Troeger <stefan.troeger@wirtschaft.tu-chemnitz.de> To: suse-linux-e <suse-linux-e@suse.com> Sent: Monday, December 27, 1999 6:35 PM Subject: Re: [SLE] Shell Programing
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
should 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/
-- 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/