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 à:
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).- 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.