2016-11-08 23 views
0

このスクリプトの目的は、フォルダ内にファイル名が存在するかどうかを確認することです。ファイル名が存在しない場合は、ファイルを削除します。Bashスクリプトは、両方のフォルダに存在しない場合、別のフォルダ内のファイルを削除します

これは、私は2つのフォルダ、alignedImagestrainingImagesを持って、これまで

#!/bin/bash 
echo "What's the folder name?" 
read folderName 
$fileLocation="/home/daniel/Dropbox/Code/Python/FR/alignedImages/$folderName" 

for files in "/home/daniel/Dropbox/Code/Python/FR/trainingImages/$folderName"/* 
do 
    fileNameWithFormatFiles=${files##*$folderName/} 
    fileNameFiles=${fileNameWithFormat%%.png*} 
    for entry in "/home/daniel/Dropbox/Code/Python/FR/alignedImages/$folderName"/* 
    do 
    fileNameWithFormat=${entry##*$folderName/} 
    fileName=${fileNameWithFormat%%.png*} 
    if [ -f "/home/daniel/Dropbox/Code/Python/FR/alignedImages/$fileNameFiles.jpg" ] 
    then 
     echo "Found File" 
    else 
     echo $files 
     rm -f $files 
    fi 
    done 
done 
read 

を得たスクリプトです。

alignedImagesのすべての画像は、trainingImagesの中にありますが、その周囲にはありません。だから、trainingImagesalignedImagesのファイルと同じ名前のファイルが含まれていない場合は、trainingImagesのファイルを削除します。

また、写真は同じではないので、md5やハッシュなどを比較することはできません。 .pngの代わりに.jpgのファイル名を除き、ファイル名は同じになります。

+0

すばらしいこと:変数に割り当てるときは '$'を含めません。 – mooiamaduck

+0

@mooiamaduckよく見て – BashTroubles

答えて

0

もっと良い方法があります!ファイルではなく、forループ!

#!/bin/bash 
echo "What's the folder name?" 
read folderName 

cd "/home/daniel/Dropbox/Code/Python/FR/alignedImages/$folderName" 
find . -type f -name "*.png" | sed 's/\.png//' > /tmp/align.list 

cd "/home/daniel/Dropbox/Code/Python/FR/trainingImages/$folderName" 
find . -type f -name "*.jpg" | sed 's/\.jpg//' > /tmp/train.list 

ここで両方のリストでファイルを検索する方法は次のとおりです。

fgrep -f /tmp/align.list /tmp/train.list | sed 's/.*/&.jpg/' > /tmp/train_and_align.list 

fgrep -vが一致するのではなく、非マッチを見つける:電車内のファイルを見つけることが、揃わない:

fgrep -v -f /tmp/align.list /tmp/train.list | sed 's/.*/&.jpg/' > /tmp/train_not_align.list 

テストの削除train_not_align.listのすべてのファイル:

cd "/home/daniel/Dropbox/Code/Python/FR/trainingImages/$folderName" 
cat /tmp/train_not_align.list | tr '\n' '\0' | xargs -0 echo rm -f 

(これは良好な出力を生成する場合、実際にそれらのファイルを削除するためにecho文を削除してください。)

+0

ありがとうございました!私は少し問題がある。端末では 'grep:align.list:そ​​のようなファイルやディレクトリはありません。 grep:align.list:そ​​のようなファイルやディレクトリはありません '私の/ tmp /フォルダを見ると変です。私はそれらのファイルを参照してください – BashTroubles

+0

私はそれらの前に '/ tmp /'を追加して修正しました。 – BashTroubles

+0

Welp。 'trainingImages'の中のすべてを削除しました。だから...残念です=/ – BashTroubles

1
fileLocation="/home/daniel/Dropbox/Code/Python/FR/alignedImages/$folderName" 
echo "What's the folder name?" 
read folderName 

rsync --delete --ignore-existing $fileLocation $folderName 

rsyncコマンドは、あなたが探しているとするとき、それは先のディレクトリからその任意のファイルを削除します--deleteオプションが与えられているものですソースディレクトリに存在せず、--ignore-existingは、同じ名前のファイルがすでに宛先ディレクトリに存在する場合、rsyncがソースからファイルをスキップするのをスキップします。

この副作用は、ソースdirにはファイルはコピーされますが、コピー先にはコピーされません。あなたはソースのすべてのファイルが目的地にあると言うので、それはOKだと思います。

+0

これはすばらしいことですが、実際の写真ではなく、ファイル名だけがそこにあることを意味しました。だから私は正確にそれを同期させることはできません= – BashTroubles

関連する問題