find & remove characters in filenames


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers find & remove characters in filenames
# 1  
Old 12-18-2011
find & remove characters in filenames

I have a group of files in different directories with characters such as " ? : in the file names. How do I find these files and remove these characters on mass?

Thanks
# 2  
Old 12-18-2011
Backup your files first:

Code:
find . -type f -name '*[:?"]*' |
  while IFS= read -r; do
    mv -- "$REPLY" "${REPLY//[:?\"]}"
  done

The script will simply remove those characters. If you want to substitute them with some other character
(underscore, for example) use the following syntax:
Code:
${REPLY//[:?\"]/_}

N.B. The script above uses non standard shell syntax, let me know if your shell doesn't support it.

${varname//../..} is supported by ksh93, zsh and bash.
This User Gave Thanks to radoulov For This Post:
# 3  
Old 12-18-2011
I assume I paste this into a bash script?
Thanks
# 4  
Old 12-18-2011
Yes, or execute it directly on the command prompt.
This User Gave Thanks to radoulov For This Post:
# 5  
Old 12-18-2011
works a treat, thanksSmilie
# 6  
Old 12-18-2011
Quote:
Originally Posted by radoulov
Code:
find . -type f -name '*[:?"]*' |
  while IFS= read -r; do
    mv -- "$REPLY" "${REPLY//[:?\"]}"
  done

Very nice radoulov! I'm a bash dude and was familiar with ${VAR/MATCH/REPLACE/} syntax but didn't know about all the extra details, so was a bit confused at first. For anyone else that's looking for an explanation, here's the relevant bit from bash's man page:
Code:
${parameter/pattern/string}
   Pattern substitution.  The pattern is expanded to produce  a  pattern  just  as  in  
   pathname expansion.  Parameter is expanded and the longest match of pattern against
   its value is replaced with string.  If pattern begins with /, all matches  of  pat‐
   tern are replaced with string.  Normally only the first match is replaced.  If pat‐
   tern begins with #, it must match at the beginning of the expanded value of parame‐
   ter.   If  pattern begins with %, it must match at the end of the expanded value of
   parameter.  If string is null, matches of pattern are deleted and the  /  following
   pattern  may  be  omitted.   If  parameter is @ or *, the substitution operation is
   applied to each positional parameter in turn, and the expansion  is  the  resultant
   list.   If parameter is an array variable subscripted with @ or *, the substitution
   operation is applied to each member of the array in turn, and the expansion is  the 
   resultant list.

PS: Can you explain what exactly "IFS=" is doing in there?
# 7  
Old 12-19-2011
The IFS is reset for safety. Granted those are corner cases,
but consider the following:
Code:
% touch 'filename_with_trailing_ifs_char ' # ends with a  space
% find  -name '* ' | 
  while read; do
    printf 'mv -- |%s| |%s|\n' "$REPLY" "${REPLY// }"
  done
mv -- |./filename_with_trailing_ifs_char| |./filename_with_trailing_ifs_char|

Leading and trailing IFS characters are stripped when shell word/field splitting is performed - note that the trailing space is missing in the output.
So if you leave IFS to its default value the result would be:

Code:
% find  -name '* ' | 
  while read; do
    mv -v --  "$REPLY" "${REPLY// }"
  done    
mv: cannot stat `./filename_with_trailing_ifs_char': No such file or directory

And it's always possible that you're running the script in an environment with a modified (non-default) IFS settings.
This User Gave Thanks to radoulov For This Post:
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

To remove any invisible and special characters from the file(exclude @!#$&*)

Hi Guys, My requirement is to remove any invisible and special characters from the file like control M(carriage return) and alt numerics and it should not replace @#!$% abc|xyz|acd¥£ó adc|123| 12áí Please help on this. Thanks Rakesh (1 Reply)
Discussion started by: rakeshp
1 Replies

2. Shell Programming and Scripting

Delete characters & find unique IP addresses with port

Hi, I have a file having following content. <sip:9376507346@97.208.31.7:51088 <sip:9907472291@97.208.31.7:51208 <sip:8103742422@97.208.31.7:51024 <sip:9579892841@97.208.31.7:51080 <sip:9370904222@97.208.31.7:51104 <sip:9327665215@97.208.31.7:51104 <sip:9098364262@97.208.31.7:51024... (2 Replies)
Discussion started by: SunilB2011
2 Replies

3. Shell Programming and Scripting

How best to remove certain characters from filenames and folders recursively

hello, I'm trying to figure out which tool is best for recursively renaming and files or folders using the characters \/*?”<>| in their name. I've tried many examples that use Bash, Python and Perl, but I'm not much of a programmer I seem to have hit a roadblock. Does anyone have any... (15 Replies)
Discussion started by: prometheon123
15 Replies

4. Shell Programming and Scripting

Perl: windows filenames escape characters

I have a perl find program that will find all files of window application stored on unix disks. Ofcourse these files contain all the weird characters windows allows, but on *nix pukes out all kinds of unwanted effects when processing these. Is their a utility that will escape all these... (3 Replies)
Discussion started by: karelb
3 Replies

5. Shell Programming and Scripting

Single/Multiple Line with Special characters - Find & Replace in Unix Script

Hi, I am creating a script to do a find and replace single/multiple lines in a file with any number of lines. I have written a logic in a script that reads a reference file say "findrep" and populates two variables $FIND and $REPLACE print $FIND gives Hi How r $u Rahul() Note:... (0 Replies)
Discussion started by: r_sarnayak
0 Replies

6. Shell Programming and Scripting

Find duplicate filenames and remove in different mount point

Hi Gurus, Do any kind souls encounter have the same script as mentioned here. Find and compare filenames in different mount point and remove duplicates. Thanks a million!!! wanna13e (7 Replies)
Discussion started by: wanna13e
7 Replies

7. Shell Programming and Scripting

Bash script - stripping away characters that can't be used in filenames

I want to create a temp file which is named based on a search string. The search string may contain spaces or characters that aren't supposed to be used in filenames so I want to strip those out. My thought was to use 'tr' with but the result is the opposite of what I want: $ echo "test... (5 Replies)
Discussion started by: mglenney
5 Replies

8. Shell Programming and Scripting

Filenames created with '\r' characters at the end

Hi all, Am creating files and doing copy,compare and deletion. As i do not want to mention the filepath everywhere, i store the filepaths in variables. FILENAME="/home/test/create/Myfile.txt" WR_PATH="/home/test/wrie/writefile.txt" RD_PATH="/home/test/myread/readfile.txt" echo "This is my... (2 Replies)
Discussion started by: amio
2 Replies

9. Shell Programming and Scripting

Script to find and remove characters

Hi. I have many files in a folder, and even more in the subfolders. I need a script that finds and removes certain characters (them being /n in this one) in the files in the folder and it's subfolders. So, could someone write me a script that works in Linux, does this: Searchs for "/n" in... (5 Replies)
Discussion started by: Zerby
5 Replies

10. Shell Programming and Scripting

Perl code to search for filenames that contain special characters

Hello, I have a requirement to search a directory, which contains any number of other directories for file names that contain special characters. directory structure DIR__ |__>DIR1 |__>DIR2__ |__>DIR2.1 |__>DIR2.2 |__>DIR3 .. ... (8 Replies)
Discussion started by: jerardfjay
8 Replies
Login or Register to Ask a Question