10

I tried to display only hidden files but don't know how to do it.

That is working (but matching also dots in other places)

ls -la | grep '\.'

Was trying adding ^ but didn't find the solution.

  • 1
    Parsing ls is never a wonderful idea, but what you tried would have worked if you used the anchor ^ to denote the start of match. ls -la | grep '^\.' – devnull Apr 9 '14 at 13:15
  • 3
    No it won't, the filename isn't the beginning of the line with the -l flag. ls -la | awk '$9 ~ /^\./' will. – yoonix Apr 9 '14 at 22:23
15

ls -ld .* will do what you want.

4
find . -type f -name '\.*' -print 

Must work if you want list every hidden file down in the directory hierarchy.

2

If you want to parse ls output, you must add ^ at beginning of regex and don't use -l option. Using -l causes each line output start with file or folder permission information, not file or folder name. So you should use like this:

ls -Ad | grep '^\.'

Or you can do with printf bash builtin:

printf "%s\n" .*

If you use zsh, you can use:

print -l .*
1

Here are two other ways to find hidden files only.

find . -maxdepth 1 -name ".*" -type f -ls

or

find . -maxdepth 1 -name ".*" -type f -printf "%P \n"

Use -maxdepth to specify how far you want to search in the directory tree.

1

An improvement on Flup's answer:

ls -lad .[!.]* ..?*

This will list all files whose name starts with a dot and that are neither . nor ...

Note that if you want to pipe the output of ls to grep (which, as pointed out by devnull, is never a good idea), make sure you use \ls or command ls because if ls is aliased to show you colored output (as it is on Debian for example), its output contains ANSI escape sequences to create colored output, which will trip up your grep if its pattern is anchored at the start of line.

  • 1
    You can use -A (instead of -a) to ignore ., ... – OJFord Jul 3 '17 at 19:38
  • @OJFord+ -A differs from -a for directories that ls descends into, but both are (equally) ignored and useless for names specified on the command line with -d in effect. Also if ls is aliased to --color=auto then piping is okay; only --color=always or --color causes trouble. – dave_thompson_085 Nov 14 '18 at 7:18
0

The solution of val0x00ff is really good, but it forgets hidden directories.

If you want hidden files and hidden directories, without . and .. :

find -maxdepth 1 -regex '\./\..+' -printf "%P\n"
  • Your suggestion fails on VMware ESXi (list no files and no directories) and sort of fails on Linux too (with maxdepth > 1, it also lists any files in a directory starting with a .), but this works on both Linux and ESXi: find . \( -type f -o -type d \) -name '\.*' -print; apply maxdepth where needed. – Jeroen Wiert Pluimers May 6 '18 at 7:38
0

Below one is much compact and support many variants

1) Display hidden files, directories and sub-directories

find . | grep "^\./\."

2) Display hidden directories and sub-directories only

find . -type d | grep "^\./\."

3) Display hidden files only in current and sub-directories

find . -type f | grep "^\./\."

4) Display hidden files and directories in current folder

find . -maxdepth 1 | grep "^\./\."

-1

You can try :

ls -a |grep -E  "^\."

^ indicates it's the beginning of content with regexp

  • 1
    A duplicate of another answer from 3 years ago ... – Jeff Schaller Nov 28 '17 at 11:55
  • I saw the previous answer , it's not duplicate , and definitely "ls -a" and "ls -Ad" don't have the same meaning . "-a" means list all including files/directories begins with "." -A means list all but excluding "." , ".." and directory content. – Lingjing France Nov 28 '17 at 12:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.