Home > Mobile >  Find patterns and rename multiple files
Find patterns and rename multiple files

Time:10-09

I have a list of machine names and hostnames

ex)

# cat /tmp/machine_list.txt

[one]apple machine #1  myserver1
[two]apple machine #2  myserver2
[three]apple machine #3  myserver3

and, server each directory and each directory contains an tar file and a file with the host name written on it.


# ls  /tmp/sos1/*
sosreport1.tar.gz
hostname_map.txt

# cat /tmp/sos1/hostname_map.txt 
myserver1


# ls  /tmp/sos2/*
sosreport2.tar.gz
hostname_map.txt

# cat /tmp/sos2/hostname_map.txt 
myserver2


# ls  /tmp/sos3/*
sosreport3.tar.gz
hostname_map.txt

# cat /tmp/sos3/hostname_map.txt 
myserver3

Is it possible to rename the sosreport*.tar.gz by referencing the hostname_map in each directory relative to the /tmp/machine_list.txt file? (like below)

# ls  /tmp/sos1/*
[one]apple_machine_#1_myserver1_sosreport1.tar.gz

# ls  /tmp/sos2/*
[two]apple_machine_#2_myserver2_sosreport2.tar.gz

# ls  /tmp/sos3/*
[three]apple_machine_#3_myserver3_sosreport3.tar.gz

A single change is possible, but what about multiple changes?

CodePudding user response:

Something like this?

srvname () {
    awk -v srv="$(cat "$1")" -F '\t' '$2==srv { print $1; exit }' machine_list.txt
}
 
for dir in /tmp/sos*/; do
    server=$(srvname "$dir"/hostname_map.txt)
    mv "$dir"/sosreport*.tar.gz "$dir/$server.tar.gz"
done

Demo: https://ideone.com/TS5VyQ

The function assumes your mapping file is tab-delimited. If you want underscores instead of spaces in the server names, change the mapping file.

This should be portable to POSIX sh; the cat could be replaced with a Bash redirection, but I feel that it's not worth giving up portability for such a small change.

If this were my project, I'd probably make the function into a self-contained reusable script (with the input file replaced with a here document in the script itself) since there will probably be more situations where you need to perform the same mapping.

  • Related