2017-09-16 14 views
0

J'ai un chemin de répertoire de niveau supérieur et je veux convertir tous les chemins relatifs en chemins absolus existant dans tous les fichiers de ce répertoire de manière récursive. par exemple. J'ai cette structure dir:Script Bash & Perl pour convertir les chemins relatifs en chemins absolus

$ tree 
. 
|-- DIR 
| |-- inner_level.ext1 
| `-- inner_level.ext2 
|-- top_level.ext1 
`-- top_level.ext2 

Contenu de top_level.ext1:

../../a/b/c/filename_1.txt 
../../a/d/e/filename_2.txt 

Assumer le chemin dir niveau supérieur est /this/is/the/abs/dir/path/

Vous voulez convertir le contenu de top_level.ext1 à:

/this/is/the/abs/a/b/c/filename_1.txt 
/this/is/the/abs/a/d/e/filename_2.txt 

Contenu de top_level.ext2:

cc_include+=-I../../util1/src/module1/moduleController -I../../util/src/module1/module2Controller; 
cc_include+=-I../../util2/src/module2/moduleUtility; 

Vous voulez convertir le contenu de top_level.ext2 à:

cc_include+=-I/this/is/the/abs/util1/src/module1/moduleController -I/this/is/the/abs/util/src/module1/module2Controller; 
cc_include+=-I/this/is/the/abs/util2/src/module2/moduleUtility; 

, veulent aussi appliquer cette même conversion sur les fichiers à l'intérieur DIR.

par exemple. Contenu de DIR/inner_level.ext1:

../../../a/b/c/filename_1.txt 
../../../a/d/e/filename_2.txt 

Vous voulez convertir le contenu de DIR/inner_level.ext1 à:

/this/is/the/abs/a/b/c/filename_1.txt 
/this/is/the/abs/a/d/e/filename_2.txt 

Même chose pour la DIR/inner_level.ext2 aussi.

A écrit ces deux scripts.

La conversion de top_level.ext1 fonctionne correctement.

file_manager.sh:

#!/usr/bin/bash 
file='resolve_path.pl' 
basedir='/this/is/the/abs/dir/path' 

run_perl(){ 
    echo -e "\n File getting modified: $1" 
    cp $1 tmp.in 
    perl $file 
    mv tmp.out $1 
    rm tmp.in 
} 

find $basedir -type f |while read inputfile 
do 
    run_perl $inputfile 
done 

resolve_path.pl:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 
use 5.010; 
use Switch; 

#****************************************************** 
#  Set-up Directory And Input/Output File Names 
#****************************************************** 
our $in_file = glob('tmp.in'); 
my $out_file1 = 'tmp.out'; 
print "Input file: $in_file\n"; 

#************************************ 
#  Local and Global Variables 
#************************************* 
my $current_path = "/this/is/the/abs/dir/path"; 
my $temp_path = $current_path; 

#************************************ 
#  Open Read and Write File 
#************************************ 
open(READ, $in_file) || die "cannot open $in_file"; 
open(WRITE, ">$out_file1") || die "cannot open $out_file1"; 


#****************************************************** 
#  Read The Input [*.out] File Line By Line 
#****************************************************** 
while (<READ>) { 
    if(/^(\.\.\/){1,}(\w+\/)*(\w+).(\w+)/){ 
     my $file_name = $3; 
     my $file_ext = $4; 

     my @count = ($_ =~ /\.\.\//g); 
     my $cnt = @count; 

     my @prev_dir = ($_ =~ /\w+\//g); 
     my $prev_dir_cnt = @prev_dir; 
     my $file_prev_dir = join('', @prev_dir); 

     $temp_path = $current_path; 
     for(my $i=0; $i<$cnt; $i++){ 
      if($temp_path =~m/(\/.*)\/\w+/){ 
       $temp_path = $1; 
      } 
     } 

     print WRITE "$temp_path"."\/"."$file_prev_dir"."$file_name"."\."."$file_ext"."\n"; 

    } else { 
     print WRITE "$_"; 
    } 
} 

Questions Je suis face à:

  1. Aucune conversion est appliqué sur top_level.ext2 & DIR/inner_level.ext2 car mon script Perl n'est pas correctement analysé pour ../ es (c.-à-d. cc_include+=-I arrive au début).

  2. conversion de

    chemin relatif au chemin absolu ne fonctionne pas correctement pour DIR/inner_level.ext1 et un mauvais chemin devient jointe en annexe.

Il serait utile que quelqu'un puisse suggérer des changements attendus dans mes scripts pour résoudre les deux problèmes susmentionnés.

Répondre