简体   繁体   中英

Rename multiple folder names based on Text file

I would like to rename folders name in specific path based on text list I will provide. for example, I have folders list structure as following:

 /home/XXX-01/$file1
 /home/XXX-12/$file2
 /home/XXX-23/$file66
 /home/XXX-32/$file44
 /home/XXX-123/$file65

and rand.txt file with details what folder name need to be change to, for example

XXX-22
XXX-33
XXX-55
XXX-4321
XXX-24456

the final folder structure would be like

 /home/XXX-22/$file1
 /home/XXX-33/$file2
 /home/XXX-55/$file66
 /home/XXX-4321/$file44
 /home/XXX-24456/$file65

thank you

Using GNU awk version 4.0.2

 awk 'NR==FNR { # Process the list of directories (direcs.txt)
                map[NR]=$0 # Create an array indexed by the number record and with the directory as the value
              } 
      NR!=FNR { # Process the output of the find command
                
                newpath=gensub("(/home/)(.*)(/.*$)","\\1"map[NR]"\\3",$0); # Create the new path using the entry in the map array
                newdir=gensub("(/home/)(.*)(/.*.txt$)","\\1"map[num],$0) # Create the directory to create.
                print "mkdir "newdir # Print the mkdir command
                print "mv "$0" "newpath # Print the command to execute
              }' direcs.txt <(find /home -regextype posix-extended -regex "^.*[[:digit:]]+.*$")

One liner:

 awk 'NR==FNR {map[NR]=$0} NR!=FNR { newpath=gensub("(/home/)(.*)(/.*.txt$)","\\1"map[NR]"\\3",$0);newdir=gensub("(/home/)(.*)(/.*.txt$)","\\1"map[num],$0);print "mkdir "newdir;print "mv "$0" "newpath }' direcs.txt <(find /home -regextype posix-extended -regex "^.*[[:digit:]]+.*$")

Once you are happy that the commands look as expected, execute by piping through to bash/sh and so

 awk 'NR==FNR {map[NR]=$0} NR!=FNR { newpath=gensub("(/home/)(.*)(/.*.txt$)","\\1"map[NR]"\\3",$0);newdir=gensub("(/home/)(.*)(/.*.txt$)","\\1"map[num],$0);print "mkdir "newdir;print "mv "$0" "newpath }' direcs.txt <(find /home/robbo -regextype posix-extended -regex "^.*[[:digit:]]+.*$") | bash

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