The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > UNIX for Advanced & Expert Users
Google UNIX.COM


UNIX for Advanced & Expert Users Advanced UNIX and Linux questions go here. Expert-to-Expert.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Duplicates to be removed prvnrk Shell Programming and Scripting 6 07-10-2008 10:06 AM
a way to tell what was removed after rm -rf ? thosch UNIX for Dummies Questions & Answers 4 06-30-2008 02:20 AM
after init all /tmp file has been removed yesthomas SUN Solaris 5 12-06-2005 03:48 AM
directories are not getting removed slavam Shell Programming and Scripting 6 11-17-2005 05:26 PM
Will Old Files Be Removed sunsation UNIX for Dummies Questions & Answers 5 06-26-2005 09:24 PM

Reply
 
Submit Tools LinkBack Thread Tools Search this Thread Display Modes
  #1  
Old 09-01-2008
Registered User
 

Join Date: Sep 2008
Posts: 6
Removed ^M from Libraries

I used the following to remove ^M in all files - I guess i did it in haste

find / -name "*" | xargs perl -p -i -e 's/^M//g' *


It changed all my LIBRABRIES since i used -- perl -p -i -e 's/^M//g' *

Is there some way to revert this from my libraries . Does any revert command exits for the Control M in libraries. I believe my libraries are corrupted now.

Regards,
Telecomics
Reply With Quote
Forum Sponsor
  #2  
Old 09-01-2008
Bughunter Extraordinaire
 

Join Date: May 2005
Location: In the leftmost byte of /dev/kmem
Posts: 1,262
Sorry, but in this case a R&R (reboot and restore) is called for.

It is not - not even theoretically - possible to revert this because it is not clear where the "^M"s have been: You have EOLs which are preceeded by a ^M and EOLs which aren't. It is easy to search for the ones which are and change them - like you have done. But now you have only EOLs which aren't preceeded by ^M and if you now add a ^M before each of them your libraries will perhaps be as corrupted as they are now because there will be any number of superfluous ^Ms in there.

I hope this helps - if only to avoid it the next time.

bakunin
Reply With Quote
  #3  
Old 09-01-2008
era era is offline
Herder of Useless Cats
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,650
As a minor correction to what bakunin wrote, actually ^M doesn't stand for carriage return, it means the character M at beginning of line (i.e. beginning of file or immediately after a line feed).
Reply With Quote
  #4  
Old 09-02-2008
Registered User
 

Join Date: Mar 2006
Posts: 143
Hm, I would think it depends on what the poster has really typed when he entered the perl statement's substitution.
If he pressed ^V and then hit Enter then ^M should represent \015.
But if he actually only typed a caret (or circumflex) followed by upper case M,
yes than it just represents those Ms.
Maybe he should pipe his statement from the history into an octal dump to make sure?
Code:
$ echo ^M|od -t a
0000000  cr  nl
0000002

$ echo ^M|od -t a
0000000   ^   M  nl
0000003
Reply With Quote
  #5  
Old 09-02-2008
era era is offline
Herder of Useless Cats
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,650
It's really immaterial; the pivotal point here is that it cannot be undone.
Reply With Quote
  #6  
Old 09-02-2008
Registered User
 

Join Date: Mar 2006
Posts: 143
I never questioned that.
As the other poster already said, it's time to role the restore from the backup.
Just an aside,
if you (the thread issuer) like me have your filesystems on LVM volumes (yes I do have a separate lv_usr)
there is a neat feature that can be used for rolling back quickly from an unfortunate experiment like yours without even rolling a regular backup.
Before I do such dubious recursive substitutions I just would create a snapshot volume of the affected LV like
Code:
[root@toshsat:~]
# df /usr
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vgfc-lv_usr
                       5160576   3193892   1704540  66% /usr
[root@toshsat:~]
# vgdisplay vgfc|egrep 'PE Size|Free  PE'
  PE Size               8.00 MB
  Free  PE / Size       11 / 88.00 MB
[root@toshsat:~]
# lvcreate -s -n snapof_usr -l 11 /dev/vgfc/lv_usr
  Logical volume "snapof_usr" created
[root@toshsat:~]
# lvs -o lv_name,lv_size,origin,snap_percent vgfc
  LV           LSize   Origin Snap% 
  lv_depot       9.80G              
  lv_home      512.00M              
  lv_opt       512.00M              
  lv_root        1.00G              
  lv_tmp       512.00M              
  lv_usr         5.00G              
  lv_usr_local 256.00M              
  lv_var         1.00G              
  snapof_usr    88.00M lv_usr   0.01
Above I only created a snapshot of 88 MB of the 5 GB /usr volume because I hadn't any more free PEs in my vgfc.
Normally, one would adapt this to the size of the snapped of LV and the anticipated amount of changes during the period one would possibly require the snapshot.
As a rule of thumb 10% suffice, but this depends on the changes in the filesystem.
Since /usr is pretty static (and even could be mounted ro often) there won't be many changes.
From the lvs command above you can watch the filling up of the snapshot with the changes.
Once the snap_percent approaches 100% your snapshot is useless and can't be any longer used for recoveries.
Now you can safely run your command.
If something goes wrong, you simply mount the snapshot volume ro somewhere and run your restore.
Once you no longer need your snapshot simply lvremove it.
Code:
[root@toshsat:~]
# mount -r /dev/vgfc/snapof_usr /mnt/tmp2
[root@toshsat:~]
# df /usr /mnt/tmp2
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vgfc-lv_usr
                       5160576   3193892   1704540  66% /usr
/dev/mapper/vgfc-snapof_usr
                       5160576   3193892   1704540  66% /mnt/tmp2
[root@toshsat:~]
# umount /mnt/tmp2
[root@toshsat:~]
# lvremove -f /dev/vgfc/snapof_usr 
  Logical volume "snapof_usr" successfully removed

Last edited by buffoonix; 09-02-2008 at 02:03 AM.
Reply With Quote
  #7  
Old 09-02-2008
Bughunter Extraordinaire
 

Join Date: May 2005
Location: In the leftmost byte of /dev/kmem
Posts: 1,262
Quote:
Originally Posted by era View Post
As a minor correction to what bakunin wrote, actually ^M doesn't stand for carriage return, it means the character M at beginning of line (i.e. beginning of file or immediately after a line feed).
You are right, of course. The reason for this is the only way i ever had to use "^M" was to remove DOS-style CR/LFs from text documents, like

sed 's/^M$//' document

therefore seeing the "^M" evocated this Pavlovian reflex in me - "use of ^M must mean remove CR/LFs" and i didn't even read any further. Of course "^M" means, in the normal sense of a non-escaped character, an M at the beginning of a line like you pointed out correctly.

Sigh, this comes from working in DOS/Windows-contaminated environments for too long. I probably got infected.

bakunin
Reply With Quote
Google The UNIX and Linux Forums
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes




All times are GMT -7. The time now is 01:53 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008. All Rights Reserved.Ad Management by RedTyger Visit The Complex Event Processing Blog

Content Relevant URLs by vBSEO 3.2.0