Linux find only current directory

How to only find files in a given directory, and ignore subdirectories using bash

I’m running the find command to find certain files, but some files in sub-directories have the same name which I want to ignore. I’m interested in files/patterns like this:

/dev/abc-scanner /dev/abc-cash . . . /dev/.udev/names/abc-scanner /dev/.udev/names/abc-cash 

ignore specific subdirectories, or not descend into any subdirectories? For the latter, use the -maxdepth 1 option

6 Answers 6

If you just want to limit the find to the first level you can do:

 find /dev -maxdepth 1 -name 'abc-*' 

. or if you particularly want to exclude the .udev directory, you can do:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print 

If I wanted to list where all the above symlinks pointed to found in the above pattern, would I just use a pipe? Something like find /dev -maxdepth 1 -name ‘abc-*’ | ls -l

It’s better to use xargs instead, so something like: find /dev -maxdepth 1 -name ‘abc-*’ | xargs ls -l but if there’s any chance that they will have whitespace in the names, you should do find /dev -maxdepth 1 -name ‘abc-*’ -print0 | xargs -0 ls -l

However, as Stephen Darlington’s answer points out, I’m not sure why you wouldn’t just do ls -l /dev/abc-*

Also, if you want to find out where symlinks point to, you can do for x in /dev/abc-*; do readlink -f $x; done

Or if you want subdirectories only on the first level, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev . except at least on my Linux /dev/*/* does not include files in /dev/.udev/* so you can omit the fgrep -v .

Читайте также:  Создать загрузочную флешку линукс виндовс

Is there any particular reason that you need to use find ? You can just use ls to find files that match a pattern in a directory.

If you do need to use find , you can use the -maxdepth 1 switch to only apply to the specified directory.

It should be pointed out that the wildcard is the important part here, not ls . You can find the same files with echo or wc or what have you, because the shell expands the wildcard for you. So for file in /dev/abc-*; do something with each «$file»; done might be what the OP is actually looking for.

Ah, I can never remember which way round it is. Thanks for the edit. Also, worth noting that it’s not universal. The Solaris version of find doesn’t have it for example.

This may do what you want:

find /dev \( ! -name /dev -prune \) -type f -print 

I got here with a bit more general problem — I wanted to find files in directories matching pattern but not in their subdirectories.

My solution (assuming we’re looking for all cpp files living directly in arch directories):

find . -path «*/arch/*/*» -prune -o -path «*/arch/*.cpp» -print

I couldn’t use maxdepth since it limited search in the first place, and didn’t know names of subdirectories that I wanted to exclude.

There is an alternative to find called rawhide (rh) and it’s much easier to use. Instead of:

find /dev -maxdepth 1 -name 'abc-*' 

The -r is the same as «-m1 -M1» which is the same as find’s «-mindepth 1 -maxdepth 1», just a lot shorter.

Читайте также:  Linux motion все настройки

Rawhide (rh) is available from https://raf.org/rawhide or https://github.com/raforg/rawhide. It works at least on Linux, FreeBSD, OpenBSD, NetBSD, Solaris, macOS, and Cygwin.

Disclaimer: I am the current author of rawhide

find /dev -maxdepth 1 -name 'abc-*' 

Does not work for me. It return nothing. If I just do ‘.’ it gives me all the files in directory below the one I’m working in on.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls 

Return nothing with ‘.’ instead I get list of all ‘big’ files in my directory as well as the rootfiles/ directory where I store old ones.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls 564751 71 -rw-r--r-- 1 snyder bfactory 115739 May 21 12:39 ./R24eTightPiPi771052-55.root 565197 105 -rw-r--r-- 1 snyder bfactory 150719 May 21 14:27 ./R24eTightPiPi771106-2.root 565023 94 -rw-r--r-- 1 snyder bfactory 134180 May 21 12:59 ./R24eTightPiPi77999-109.root 719678 82 -rw-r--r-- 1 snyder bfactory 121149 May 21 12:42 ./R24eTightPiPi771098-10.root 564029 140 -rw-r--r-- 1 snyder bfactory 170181 May 21 14:14 ./combo77v.root 

Apparently /dev means directory of interest. But ./ is needed, not just . . The need for the / was not obvious even after I figured out what /dev meant more or less.

I couldn’t respond as a comment because I have no ‘reputation’.

Источник

UNIX for Dummies Questions & Answers

Member Information Avatar

3, 0

Data

I am trying to use the find command to find files in the current directory that meet a certain date criteria.

However, the above also checks the directories below.
I tried -prune , but that seems to ignore this directory completely.

I read about using -path w/ -prune , but -path is not recognized by my system. Neither is -maxdepth.

Читайте также:  Чем линукс отличается от unix

Any help would be greatly appreciated.

Forum Staff

Neo

Member Information Avatar

19,118, 3,359

from the GNU find man page:

find — search for files in a directory hierarchy

Descend at most levels (a non-negative integer) levels of directories below the command line arguments.

`-maxdepth 0′ means only apply the tests and actions to the command line arguments

Member Information Avatar

3, 0

Thanks for the response.
However, as I mentioned in the initial posting, the -maxdepth does not seem to work on my system. See Below:

find . -maxdepth 0 -type f -mtime +2 find: 0652-017 -maxdepth is not a valid option.

Or am I doing something wrong?

When I man find on my system, maxdepth is not shown. I only knew about it from searching around UNIX sites on the net.

Forum Staff

Neo

Member Information Avatar

19,118, 3,359

You may not be running GNU utilities. When I work on differnet flavors of UNIX like systems (HP-UX, Solaris) one of the first things I do is set up a development environment to compile GNU utilities for the platforms. The GNU compiler can compile for just about every OS on this planet (and maybe other planets!) You might find it faster to just build a GNU version of find (and then you will be set up for other builds in the future too!!)

The first challenge in this approach is to install a GNU C compiler for your platform. This can be trickly for newbies. However, if you can ‘get through it’, the rewards are great and very worthwhile.

Perhaps someone else will have a better reply if you state the exact version of find (and the platform).

Источник

Оцените статью
Adblock
detector