2011-01-02 24 views
1

My IMは連絡先名に従ってログを保存します。私はアクティブな連絡先のリストを含むファイルを作成しました。私の問題は次のとおりです:ログで古いディレクトリを削除する

ファイルからアクティブな連絡先の名前を読み取って、それをディレクトリと比較してbashスクリプトを作成したいと考えています。ディレクトリ名がリストにない場合は、別のディレクトリに移動します(「アーカイブ」としましょう)。私はあなたのためにそれを視覚化しようとします。リストの

  • 内容:DIR

contact1
contact2
contact3の

contact1
contact2

  • コンテンツcontact4

    • スクリプトの実行後、DIR FO内容:

    contact1
    contact2

    contact3 ==> ../archive
    contact4 ==>。 ./archive

答えて

0

これはmarcogの答えの改良版です。連想配列にはBash 4が必要であることに注意してください。

#!/bin/bash 
sourcedir=/path/to/foo 
destdir=/path/to/archive 
contactfile=/path/to/list 

declare -A contacts 

while read -r contact 
do 
    contacts[$contact]=1 
done < "$contactfile" 

for contact in "$sourcedir"/* 
do 
    if [[ -f $contact ]] 
    then 
     index=${contact##*/} 
     if [[ ! ${contacts[$index]} ]] 
     then 
      mv "$contact" "$destdir" 
     fi 
    fi 
done 

編集:

あなたは、ディレクトリの代わりに、ファイルを移動している場合は、このように見えるように上記forループを変更:

for contact in "$sourcedir"/*/ 
do 
    index=${contact/%\/} 
    index=${index##*/} 
    if [[ ! ${contacts[$index]} ]] 
    then 
     mv "$contact" "$destdir" 
    fi 
done 
+0

@Denis ...申し訳ありませんが、どちらも動作していません。私はループの各部分に "エコーテスト"の行を追加しました。 $ sourcedir "/ * do"ループの "if contact"の中に "if"が存在しないようです。 – Mcgiwer

+0

@Mcgiwer: '' $ sourcedir "'のすべてのエントリがディレクトリであり、noneであることを示しているようです通常のファイルです。これらのディレクトリを移動したい場合は、私の編集した回答を参照してください。 –

+0

編集したものがうまくいったようです。ありがとう – Mcgiwer

0

もっと簡潔な解決策があるかもしれませんが、これは機能します。最初にそれをテストするためにmvのプレフィックスをechoにすることを強くお勧めします。そうでなければ、あなたが望むことをしないと深刻な混乱を招く可能性があります。

declare -A contacts 
for contact in "[email protected]" 
do 
    contacts[$contact]=1 
done 
ls a | while read contact 
do 
    if [[ ! ${contacts[$contact]} ]] 
    then 
    mv "a/$contact" ../archive 
    fi 
done 
+0

が、この作品にも場合のいずれかを実行します連絡先の名前には空白が含まれます。特殊文字ですか? – philonous

+0

@philonousいいえ、私はそれを修正します。私はまた、私はそれを修正するので、私は質問を誤解を実現しました。 – marcog

+1

ファイル名の空白を修正しましたが、名前に二重引用符が含まれていると失敗します。私はあなたがそれをどのように修正するか分からない。 – marcog

1

あなたはこのようなものを使用することができます../file.txtが移動すべきではないディレクトリの名前が含まれてい

mv $(ls | grep -v -x -F -f ../file.txt) ../archive 

。ここでは、現在のディレクトリにディレクトリのみが含まれていると仮定します。そうでない場合は、lsを別のものに置き換える必要があります。移動する必要のあるディレクトリがない場合、コマンドは失敗することに注意してください。

あなたが名前に空白文字を持つディレクトリが発生する可能性があることを述べる他の回答にコメントで、あなたがすることによってこれを置き換えることができますので:

for i in * 
do 
    echo $i | grep -v -x -q -F -f ../file.txt && mv "$i" ../archive 
done 
+0

+1すてきな答え!私はもっ​​と簡潔な答えが必要であることを知っていました。 – marcog

関連する問題