1

I have a number of image files that have duplicates across case (ie file.jpg File.jpg). I need a script like the following except I want to completely remove all uppercase. I know that fslint can do this, but I want to do it in terminal because there are so many..

find . -maxdepth 1 -print0 | sort -z | uniq -diz 

case-insensitive search of duplicate file-names

2
  • 2
    You need to be more specific. For example would ./mydir/myfiLe.jpg be considered a duplicate of ./otherdir/myfile.jpg? Commented Jul 5, 2016 at 19:52
  • I'm sure somebody would find it useful to do this across different paths, but I'm primarily concerned with files in the same directory because, if I understand correctly, this particular situation poses a challenge for windows/mac in a git repo. Commented Jul 6, 2016 at 14:47

1 Answer 1

1

The following script may do what you want (I have it set to echo what it would do, rather than actually do it, so you can see)

#!/bin/bash # This variable will always be in lower case. That means that if you do # l=Hello the result will be $l==hello. typeset -l l for f in * do l=$f # Forces to lowercase due to typeset if [ "$l" != "$f" -a -e "$l" ] then echo rm "$f" fi done 

So, for example:

$ ls FIle.JpG File.jpg file.jpg $ rem_case_dup.sh rm FIle.JpG rm File.jpg 
5
  • 1
    And, if you're not certain the upper case files really are dups, you might add a test that they contain the same data (some variant of if diff >/dev/null 2>&1 will do it, lots of other choices too). Commented Jul 6, 2016 at 1:20
  • 1
    (1) This answer would be better if you explained how $l can be different from $f right after you’ve assigned l=$f.  Please do not respond in comments; edit your answer to make it clearer and more complete.   (2) The use if -a (and -o) in [] expressions is discouraged.  Consider using if [ "$l" != "$f" ]  &&  [ -e "$l" ] instead. Commented Jul 6, 2016 at 7:03
  • Sorry, I didn't think basic typeset features needed explaining; they've only been around for 25+ years, so aren't new! A couple of comments added. Why is -a discouraged? Commented Jul 6, 2016 at 10:38
  • This is great. How can I make it recursive? Commented Jul 6, 2016 at 16:09
  • Change the for loop to something like find . -type f | while read -r f - have the find` statement determine the scope of your checks; the rest of the loop will compare to files in the same directory as the upper case file was found in. Commented Jul 6, 2016 at 16:11

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.