2

I started learning linux on vmware using centos 7. I created an image directory and several layers of files and sub-directories in that folder. most of the names containing spaces. I want to use a single command to rename all the files and directories at once.

command i am using right now is

find . -type f -exec rename "find" "replace" {} \;
&
find . -type d -exec rename "find" "replace" {} \;
Where as find is a space and replace is "-"(hiphen). I even tried below command looking at one of the answer in stack exchange.
find . -iname "find" -exec rename "find" "replace" {} \;
Syed Mudabbir
  • 53
  • 2
  • 9

2 Answers2

2

Since you're going to rename directories under find's nose, tell it to act on the content of a directory before the directory itself, with -depth. On the other hand, doing directories separately from regular files doesn't help.

To rename a file with the tools that are available on a default CentOS installation, you can use a shell and mv. Take care to change only the base name, not the directory name (since the new directory doesn't exist yet).

find . -depth -exec bash -c '
  for filename do
    basename=${filename##*/}
    mv "$filename" "${filename%/*}/${basename// /-}"
  done
' _ {} +
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
  • Thanks for the answer, sorry i did not understand how for .. do is working here. -depth works for any number of depth? and is it working like this for `dir1/dir2/dir3...` 1. Go through files in dir1 then dir1, 2. Go through files in dir2 then dir2. and so on... – Syed Mudabbir Feb 25 '16 at 23:26
  • 1
    @SyedMudabbir Yes, `-depth` means to go through `dir2` before `dir1`, and `dir3` before `dir2`, etc. – Gilles 'SO- stop being evil' Feb 25 '16 at 23:28
1

Usual zsh answer to this kind of question:

autoload zmv # best in ~/.zshrc
zmv -v '(**/)(* *)' '$1${2// /-}'

It takes care of processing the files depth-first, and checks for conflicts or overwrites (regular files only) better than you'd usually do by hand.

Stéphane Chazelas
  • 522,931
  • 91
  • 1,010
  • 1,501