Home > front end >  Bash to find missing file
Bash to find missing file

Time:11-04

I'm counting files in a photos folder:

% find . -type f | wc -l
   22188

Then I'm counting files per extension:

% find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
 268 AVI
14983 JPG
  61 MOV
   1 MP4
 131 MPG
   1 VOB
  21 avi
   1 jpeg
6602 jpg
  12 mov
  20 mp4
  74 mpg
  12 png

The sum of that is 22187, not 22188. So I thought it could be a file without extension:

% find . -type f ! -name "*.*"

But the result was empty. Maybe a file starting with .:

% find . -type f ! -name "?*.*"

But also empty. How can I find out what that file is?

I'm on macOS 10.15.

CodePudding user response:

This command should find the missing file:

comm -3 <(find . -type f | sort) <(find . -type f | sed -n '/..*\./p' | sort)

CodePudding user response:

Perhaps a file with an embedded carriage return (or linefeed)?

Would be curious to see what this generates:

find . -type f | grep -Eiv '\.avi|\.jpg|\.mov|\.mp4|\.mpg|\.vob|\.avi|\.jpeg|\.png'

CodePudding user response:

Would you please try:

find . -type f -name $'*\n*'

It will pick up filenames which contain newline character. The ANSI-C quoting is supported by bash-3.2.x or so on MacOS.

CodePudding user response:

A possible cause is a file that doesn't have an extension:

touch 1.txt 2

find . -type f | wc -l
# 2

find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
#      1 txt

This command should find it for you:

find . -type f | sed 's/.[^.]*\.//' | sort | uniq -c
#      1 ./2
#      1 .txt
  • Related