2016-02-24 43 views
-1

讓我們下面簡單的例子如何找到,如果遞歸目錄中的文件也是在bash目錄B存在遞歸

A 
|-abc.txt 
|-soijwerow.txt 
|-AA 
    |-oiwejr.pdf 
    |-AAA 
     |-xyz.txt 


B 
|-xyz.txt 
|-sor233w.txt 
|-AA 
    |-o777iwejr.pdf 
    |-AAA 
     |-abc.txt 

輸出應報告的abc.txt和xyz.txt將該(以及所有相應的路徑,其中具有相同名稱的文件中找到)

應該忽略similiar目錄名

也應區分大小寫。

編輯:它應該忽略文件內容(只有文件名應該是一個檢查,而不是文件內容)。它也應該忽略相應的文件路徑。 (文件可以在特定目錄中的任何深度)

我已經試過diff -sqr A B

但不會遞歸。 (只顯示孩子)另外,它還顯示目錄結果。

+0

你在目錄A *中遞歸地指什麼?路徑應該相同嗎?無論路徑如何,文件的內容應該是相同的?它只是你正在看的文件名?你的問題很混亂。 – ffledgling

+0

請參閱編輯 – codeofnode

回答

0
#!/bin/bash 
declare -a dir2tree=() 
while IFS= read -r -d $'\0' 
do 
    dir2tree+=("$REPLY") 
done< <(find dir2 -type f -print0) 

while IFS= read -r -d $'\0' 
do 
    echo -e "----->for $REPLY in dir2 tree" 
    for filepath in "${dir2tree[@]}" 
    do 
     egrep "$(sed -r '[email protected]^.*/(.*)[email protected]\[email protected]' <<< "$REPLY")$" <<< "$filepath" 1> /dev/null && echo -e "\t$filepath" 
    done 
done< <(find dir1 -type f -print0) 

Asumming出現在文件名中沒有有趣的字符與正則表達式搞亂,我已經創建了randomd名稱的臨時目錄結構,這裏是目錄結構和輸出:

$ls -R dir1 
dir1: 
abc.txt dir4 

dir1/dir4: 
xyz.txt 
~/temp$ ls -R dir2 
dir2: 
dir3 xyz.txt 

dir2/dir3: 
tempdir 

dir2/dir3/tempdir: 
abc.txt 
~/temp$ ./script.bash 
----->for dir1/abc.txt in dir2 tree 
    dir2/dir3/tempdir/abc.txt 
----->for dir1/dir4/xyz.txt in dir2 tree 
    dir2/xyz.txt 
$ 
0

看上去好像你剛想要用完整路徑列出重複的文件名。

這樣做的一個粗略的方法是將基礎名稱的散列存儲到完整路徑,然後只在該散列中查找重複項。

你做這樣的事情:(未經測試)

#!/bin/bash 

DIR_A=/path/to/dir1 
DIR_B=/path/to/dir2 

# Create an associate array aka hash 

declare -A file_list 
# Find and store files from $DIR_A 
for file in $(find $DIR_A -type f -print) 
do 
    file_list[$(basename $file)]=$file 
done 

# Look for duplicates in $DIR_B 
for file in $(find $DIR_B -type -f -print) 
do 
    base_name=$(basename $file) 
    if [[ ${file_list[${base_name}] ]]; then 
    echo "Duplicate found for ${base_name} :" 
    echo file_name[${base_name}] 
    echo ${file} 
    fi 
done 

可能有一些邊緣情況下,這還沒有處理,例如,它不檢測目錄中的自己,我會重複裏面當我在一天晚些時候獲得時間時改進它。