I had a hard drive that couldn't mount on Linux Mint and to fix it I had to go to Windows and do chkdsk /f e:. chkdsk fixed the problem but it renamed every file with special characters and moved those files to a found.000 directory. So now I have to move and rename again those files as they were before. If I run a command from time to time to rename the files with special characters I could avoid that happening again.

I want to recursively rename files AND DIRECTORIES from the current directory. The newlines should be replaced for space, the characters < > : " \ | ? * should be removed or better yet substituted for similar characters which aren't reserved and the spaces at the start and end of a filename should be removed. Here is an example of what I want:

rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Fîlenämè $@')

Here is what would be even better:

rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Filename $@')

According to this answer it should be something like this:

LC_ALL=C find . -depth -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +

I need to ignore the ..Trash-1000 directory as this command is giving me input/output ERRORS and the command stops working. Having a script that handles those errors in case there are files in that directory that can be renamed would be perfect.

I was told to prune the ..Trash-1000 directory as in this answer. I also took a look at this one. But doing this is not working:

LC_ALL=C find . -depth -path ./..Trash-1000 -prune -o -print -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +

And it's still not deleting spaces at the start and end of the filenames.

I had to rewrite my question as the question Script to recursively replace invalid characters in filenames, not directories, with rename didn't answer mine.

  • 1
    Does this answer your question? Rename files and directories with windows or linux reserved characters Commented Mar 12, 2020 at 21:47
  • Again? I had to rewrite the question to emphasize the difference and I specifically said it isn't working.
    – user96101
    Commented Mar 12, 2020 at 21:53
  • Are you asking how to prune the ..Trash-1000 path in your find command? If so, take a look at Explain find's -path and -prune options Commented Mar 12, 2020 at 22:47
  • I still don't see the difference between this question, your previous one, and the marked duplicate. Perhaps examples of what you're trying to match would help. Commented Mar 12, 2020 at 23:26
  • I added an example of what I'm trying to do. The prune is not working for me. Is it because I'm using a relative path?
    – user96101
    Commented Mar 13, 2020 at 10:00

1 Answer 1


Instead of pruning the directory giving input/output errors the command can be executed once for each of the other directories.

This is the command that I used to remove windows reserved characters:

find . -execdir rename -n 's/[\r\n]+/ /g;
                           s/[ \f\t\v]+$//g;
                           s/^[ \f\t\v]+//g' {} \;

It turns newlines to spaces, then substitutes : for ., then changes \| with -, then removes <>"?*, then deletes spaces at the end of the filename and then it does the same for spaces at the start.

You must log in to answer this question.