2012-11-29 33 views
2

我想獲取一個目錄層次結構列表並將它們平鋪到一個目錄中。列表中稍後的任何重複文件將替換較早的文件。例如...我將如何將多個目錄壓平併疊加到一個目錄中?

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程序來做到這一點。我對用戶可能解決它的聰明方式感興趣。大的障礙是「根據需要創建中間目錄」,可能包含基本名稱和目錄名稱的組合。

我正在解決的真正問題是檢查兩個安裝的Perl庫之間的差異。我首先將每個Perl的多個庫目錄展平成一個目錄,模擬Perl將如何搜索一個模塊。我可以再diff -r他們。

回答

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 
+0

的奧德目錄環只有重要,才能正確分層。結果的最終順序無關緊要。我從來沒有見過'聲明'並且不知道bash有哈希值!我認爲files.txt是一個'find。有問題的目錄的類型f? – Schwern

+0

我想你可以做一個'find。型f';如果你想直接執行它,你可以通過下面的方式創建一個臨時文件:'while ...;做...;完成<(find。-type f)' – Rubens

相關問題