简体   繁体   中英

How to rename directory and subdirectories recursively in linux?

Let say I have 200 directories and it have variable hierarchy sub-directories, How can I rename the directory and its sub directories using mv command with find or any sort of combination?

for dir in ./*/; do (i=1; cd "$dir" && for dir in ./*; do printf -v dest %s_%02d "$dir" "$((i++))"; echo mv "$dir" "$dest"; done); done

This is for 2 level sub directory, is there more cleaner way to do it for multiple hierarchy? Any other one line command suggestions/ solutions are welcome.

You have two options when you want to do recursive operations in files/directories:

Option 1 : Find

while IFS= read -r -d '' subd;do
  #do your stuff here with var $subd
done < <(find . -type d -print0)

In this case we use find to return only dirs using -type d
We can ask find to return only files using -type f or not to specify any type and both directories and files will be returned.

We also use find option -print0 to force null separation of the find results and thus to ensure correct names handling in case names include special chars like spaces, etc.

Testing:

$ while IFS= read -r -d '' s;do echo "$s";done < <(find . -type d -print0)
.
./dir1
./dir1/sub1
./dir1/sub1/subsub1
./dir1/sub1/subsub1/subsubsub1
./dir2
./dir2/sub2

Option 2 : Using Bash globstar option

shopt -s globstar
for subd in **/ ; do
  #Do you stuff here with $subd directories
done

In this case , the for loop will match all subdirs under current working directory (operation **/ ).

You can also ask bash to return both files and folders using

for sub in ** ;do #your commands;done
  if [[ -d "$sub" ]];then 
      #actions for folders
  elif [[ -e "$sub" ]];then
      #actions for files
  else
     #do something else
  fi
done

Folders Test:

$ shopt -s globstar
$ for i in **/ ;do echo "$i";done
dir1/
dir1/sub1/
dir1/sub1/subsub1/
dir1/sub1/subsub1/subsubsub1/
dir2/
dir2/sub2/

In your small script, just by enabling shopt -s globstar and by changing your for to for dir in **/;do it seems that work as you expect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM