2

ディレクトリ階層のリストを取得し、それらを 1 つのディレクトリにフラット化したいと考えています。リストの後半にある重複ファイルは、前のファイルを置き換えます。例えば...

foo/This/That.pm
bar/This/That.pm
bar/Some/Module.pm
wiff/This/That.pm
wiff/A/Thing/Here.pm

これはで終わるだろう

This/That.pm      # from wiff/
Some/Module.pm    # from bar/
A/Thing/Here.pm   # from wiff/

これを行うには、おそらく複雑すぎるPerlプログラムがあります。SOユーザーがそれを解決する賢い方法に興味があります。大きなハードルは、おそらく basename と dirname の組み合わせを使用して、「必要に応じて中間ディレクトリを作成する」ことです。

私が解決しようとしている本当の問題は、インストールされている 2 つの Perl ライブラリの違いをチェックすることです。まず、各 Perl の複数のライブラリ ディレクトリを 1 つのディレクトリにフラット化し、Perl がモジュールを検索する方法をシミュレートします。私はそれらをすることができdiff -rます。

4

1 に答える 1

1

エントリの最終的な順序を気にしない場合は、これでうまくいくと思います。

#!/bin/bash

declare -A directory;

while read line; do
    directory["${line#*/}"]=${line%%/*}
done < $1

for entry in ${!directory[@]}; do
    printf "%s\t# from %s/\n" $entry ${directory[$entry]}
done

出力:

$ ./script.sh files.txt
A/Thing/Here.pm # from wiff/
This/That.pm    # from wiff/
Some/Module.pm  # from bar/

ファイルを移動する必要がある場合は、次のように、印刷ステップをmv-- またはcp-- に置き換えるだけです。

for entry in ${!directory[@]}; do
    mv "${directory[$entry]}/$entry" "your_dir_path/$entry"
done
于 2012-12-16T11:58:57.600 に答える