2016-10-24 15 views
2

私は、このネストされたディレクトリの重複を持つ大規模なディレクトリツリー(すべてではない)を持っているを探す:重複ネストされたディレクトリ

  • データ/ホーム/ホーム/
  • データ/バナー/バナー/
  • リソース/私はこのアクションでのみ重複するディレクトリをマージすることができますどのようにユーザー/文書/文書/

    (置き換えなし)
  • コピーデータ/ホーム/ホーム/ データ/家庭への内容/
  • データ/ホーム/ホームを削除

私の現在のコード:

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    n=$(echo $folder | tr "/" "\n" | wc -l) 
    nuniq=$(echo $folder | tr "/" "\n" | sort | uniq | wc -l) 

    [ $n -eq $nuniq ] || echo "Duplicated folder $folder" 
done 

data/home/es/homeは有効なフォルダですが、重複していると検出されています。

ありがとうございました。

+0

他のユーザーからの返信を受け取るには、試行を表示する必要があります。 – Fazlin

+0

@ファズリン、私はそれをやろうとする方法がわかりません。私は主要なlinuxコマンドを知っています。私はbashでカウンタを2倍にする方法とカウンタを使う方法を知っていますが、もっと最適化する必要があります。早急に事例を掲載します。先端に感謝します。 – Lito

答えて

2

以下のようにuniqコマンドを使用できます。

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    nuniq=$(echo $folder | tr "/" "\n" | uniq -d | wc -l) 
    if [ "$nuniq" -gt "0" ] 
     then 
     echo "Duplicated folder $folder" 
     fi 
done 

男uniqの。

-d, --repeated 
      only print duplicate lines 

あなたはコピーのために次のスクリプトを試してみて、フォルダを削除することができます。これをテストすることはできませんので、実行する前にhttpdocsフォルダのバックアップをとってください。

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    nuniq=$(echo $folder | tr "/" "\n" | uniq -d | wc -l) 
    if [ "$nuniq" -gt "0" ] 
     then 
     dest=$(echo $folder | tr '/' '\n' | awk '!a[$0]++' | tr '\n' '/') 
     mv -i $folder/* $dest 
     rmdir $folder 
     fi 
done 

たとえば、

[email protected] $ echo "data/home/es/home" | tr "/" "\n" 
data 
home 
es 
home 

[email protected] $ echo "data/home/es/home" | tr "/" "\n" | uniq -d | wc -l 
0 

[email protected] $ echo "data/home/home" | tr "/" "\n" 
data 
home 
home 

[email protected] $ echo "data/home/home" | tr "/" "\n" | uniq -d 
home 

[email protected] $ echo "data/home/home" | tr "/" "\n" | uniq -d | wc -l 
1 
関連する問題