BashTroubles
BashTroubles

Reputation: 31

Bash script delete file inside another folder if not present in both

The goal of the script is to check to see if a filename exists inside a folder. If the file name does NOT exist, then delete the file.

This is the script I got so far

#!/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

I have two folders, alignedImages and trainingImages.

All of the images in alignedImages will be inside trainingImages, but not the otherway around. So, I'm trying to make it so that if trainingImages does not contain a file with the same name as the file in alignedImages, then I want it to delete the file in trainingImages.

Also, the pictures are not the same, so I can't just compare md5's or hashes or whatever. Just the file names would be the same, except they are .jpg instead of .png

Upvotes: 1

Views: 2289

Answers (2)

webb
webb

Reputation: 4340

there is a better way! files, not for loops!

#!/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

here's how to find files in both lists:

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

fgrep -v finds non-matches instead of matches: find files in train but not align:

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

test delete of all files in 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

(if this produces good output, remove the echo statement to actually delete those files.)

Upvotes: 1

Ramast
Ramast

Reputation: 7709

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

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

rsync command is what you are looking for and when given the --delete option it will delete from destination dir any file that doesn't exist in source dir and --ignore-existing will cause rsync skip copying files from source if a file with same name already exist in destination dir.

The side effect of this is that it would copy any file in source dir but not in destination. You say all files in source are in destination so I guess that's ok

Upvotes: 2

Related Questions