Antonio AN
Antonio AN

Reputation: 135

Terminal - run 'file' (file type) for the whole directory

I'm a beginner in the terminal and bash language, so please be gentle and answer thoroughly. :)

I'm using Cygwin terminal.

I'm using the file command, which returns the file type, like:

$ file myfile1
myfile1: HTML document, ASCII text

Now, I have a directory called test, and I want to check the type of all files in it.


My endeavors:

I checked in the man page for file (man file), and I could see in the examples that you could type the names of all files after the command and it gives the types of all, like:

$ file myfile{1,2,3}
myfile1: HTML document, ASCII text
myfile2: gzip compressed data
myfile3: HTML document, ASCII text

But my files' names are random, so there's no specific pattern to follow. I tried using the for loop, which I think is going to be the answer, but this didn't work:

$ for f in ls; do file $f; done
ls: cannot open `ls' (No such file or directory)

$ for f in ./; do file $f; done
./: directory

Any ideas?

Upvotes: 2

Views: 370

Answers (3)

Chirality
Chirality

Reputation: 745

file directory/*

Is probably the shortest simplest solution to fix your issue, but this is more of an answer as to why your loops weren't working.

for f in ls; do file $f; done
ls: cannot open `ls' (No such file or directory)

For this loop it is saying "for f in the directory or file 'ls' ; do..." If you wanted it to execute the ls command then you would need to do something like this

for f in `ls`; do file "$f"; done

But that wouldn't work correctly if any of the filenames contain whitespace. It is safer and more efficient to use the shell's builtin "globbing" like this

for f in *; do file "$f"; done

For this one there's an easy fix.

for f in ./; do file $f; done
./: directory

Currently, you're asking it to run the file command for the directory "./". By changing it to " ./* " meaning, everything within the current directory (which is the same thing as just *).

for f in ./*; do file "$f"; done

Remember, double quote variables to prevent globbing and word splitting.

https://github.com/koalaman/shellcheck/wiki/SC2086

Upvotes: 1

Khanad
Khanad

Reputation: 233

You can use a combination of the find and xargs command.

For example:

find /your/directory/ | xargs file

HTH

Upvotes: 2

tvm
tvm

Reputation: 3449

Every Unix or Linux shell supports some kind of globs. In your case, all you need is to use * glob. This magic symbol represents all folders and files in the given path.

eg., file directory/*

Shell will substitute the glob with all matching files and directories in the given path. The resulting command that will actually get executed might be something like:

file directory/foo directory/bar directory/baz

Upvotes: 2

Related Questions