Linux shell list all files

Recursively List all directories and files

I would like to receive the following output. Suppose the directory structure on the file system is like this:

-dir1 -dir2 -file1 -file2 -dir3 -file3 -file4 -dir4 -file5 -dir5 -dir6 -dir7
/dir1 /dir1/dir2 /dir1/dir2/dir3 /dir1/dir2/dir4 /dir1/dir5 /dir1/dir5/dir6 /dir1/dir5/dir7
/dir1 /dir1/dir2/file1 /dir1/dir2/file2 /dir1/dir2/dir3/file3 /dir1/dir2/dir3/file4 /dir1/dir2/dir4/file5 /dir1/dir5/dir6 /dir1/dir5/dir7

7 Answers 7

In windows, to list only directories:

to list all files (and no directories):

redirect the output to a file:

Is it possible to list file sizes without grouping by folder? I’d like to import into Excel and do some reports.

Bash/Linux Shell

Bash/Shell Into a file

find ./ -type d > somefile.txt 
find ./ -type f > somefile.txt 

gives directories from current working directory, and:

gives files from current working directory.

Replace . by your directory of interest.

On Windows, you can do it like this as most flexibile solution that allows you to additionally process dir names.

You use FOR /R to recursively execute batch commands.

Check out this batch file.

@echo off SETLOCAL EnableDelayedExpansion SET N=0 for /R %%i in (.) do ( SET DIR=%%i ::put anything here, for instance the following code add dir numbers. SET /A N=!N!+1 echo !N! !DIR! ) 

Similary for files you can add pattern as a set instead of dot, in your case

will give you a list of all the contained items, with directories and files mixed. You can save this output to a temporary file, then extract all lines that start with ‘d’; those will be the directories. Lines that start with an ‘f’ are files.

This is an old question, but I thought I’d add something anyhow.

DIR doesn’t traverse correctly all the directory trees you want, in particular not the ones on C:. It simply gives up in places because of different protections.

ATTRIB works much better, because it finds more. (Why this difference? Why would MS make one utility work one way and another work different in this respect? Damned if I know.) In my experience the most effective way to handle this, although it’s a kludge, is to get two listings:

attrib /s /d C:\ >%TEMP%\C-with-directories.txt

attrib /s C:\ >%TEMP%\C-without-directories.txt

and get the difference between them. That difference is the directories on C: (except the ones that are too well hidden). For C:, I’d usually do this running as administrator.

Источник

ls command in Linux/Unix

ls is a Linux shell command that lists directory contents of files and directories.

ls syntax

$ ls [options] [file|dir]

ls command options

option description
ls -a list all files including hidden file starting with ‘.’
ls —color colored list [=always/never/auto]
ls -d list directories — with ‘ */’
ls -F add one char of */=>@| to enteries
ls -i list file’s inode index number
ls -l list with long format — show permissions
ls -la list long format including hidden files
ls -lh list long format with readable file size
ls -ls list with long format with file size
ls -r list in reverse order
ls -R list recursively directory tree
ls -s list file size
ls -S sort by file size
ls -t sort by time & date
ls -X sort by extension name
Читайте также:  Valgrind memcheck amd64 linux

ls command examples

You can press the tab button to auto complete the file or folder names.

List directory Documents/Books with relative path:

List directory /home/user/Documents/Books with absolute path.

List user’s home directory (e.g: /home/user):

List with long format and show hidden files:

Recursive directory tree list:

List only text files with wildcard:

ls redirection to output file:

List files and directories with full path:

ls code generator

Select ls options and press the Generate Code button:

Источник

How to list all files in a directory with absolute paths

I need a file (preferably a .list file) which contains the absolute path of every file in a directory.

/Users/haddad/dir1/file1.txt /Users/haddad/dir1/file2.txt /Users/haddad/dir1/file3.txt 

11 Answers 11

You can use find. Assuming that you want only regular files, you can do:

find /path/to/dir -type f > listOfFiles.list 

You can adjust the type parameter as appropriate if you want other types of files.

+1 for pointing a more future-proof solution that ls . This find does recurse the subdirectories, for non-recursive you need to add -maxdepth 1 before -type argument.

find «$(pwd)» -type f > listOfFiles.txt will list files w.r.t. working directory. Note: the file listOfFiles.txt will also be listed in this approach.

ls -d "$PWD"/* > listOfFiles.list 

That command works in any Linux or UNIX operating system. If you want to get one file per line, you need to use ls -d -1 $PWD/*

if your file names are long or terminal width is narrow,, yes, that will be the case, but say you maximized the terminal window to occupy the whole screen or your file names (including the path) are really short, that will not hold true. -1 option guarantees you get one filename per line

@MelBurslan ‘s addition is only needed if output is to a termiinal. ls detects if output is is to a file or terminal.

this will fail if there are many thousands of files in the directory, i.e. enough to exceed the maximum command line size (made more likely by the fact that the shell is expanding the filenames with full path). @Andy Dalton’s find answer is a better solution, as it won’t fail no matter how many files are to be listed.

ls -d "$PWD"/* > listOfFiles.list 

It’s the shell that computes the list of (non-hidden) files in the directory and passes the list to ls . ls just prints that list here, so you could as well do:

Note that it doesn’t include hidden files, includes files of any type (including directories) and if there’s no non-hidden file in the directory, in POSIX/csh/rc shells, you’d get /current/wd/* as output. Also, since the newline character is as valid as any in a file path, if you separate the file paths with newline characters, you won’t be able to use that resulting file to get back to the list of file reliably.

Читайте также:  Запуск ноутбука на linux

With the zsh shell, you could do instead:

print -rNC1 $PWD/*(ND-.) > listOfFiles.list 
  • -rC1 prints r aw on 1 C olumn.
  • -N , output records are NUL-delimited instead of newline-delimited (lines) as NUL is the only character that can’t be found in a file name.
  • N : expands to nothing if there’s no matching file ( nullglob )
  • D : include hidden files ( dotglob ).
  • -. : include only regular files ( . ) after symlink resolution ( — ).

Then, you’d be able to do something like:

To remove those files for instance.

You could also use the 😛 modifier in the glob qualifiers to get the equivalent of realpath() on the files expanded from the globs (gets a full path exempt of any symlink component):

print -rNC1 -- *(ND-.:P) > listOfFiles.list 

Using printf has the added bonus that you won’t get a ‘command line too long’ error if you have thousands of files as printf is not run as a separate process.

@AdrianPronk, yes, except in shells where printf is not built-in like pdksh and some of its derivatives or most versions of the Bourne shell. One drawback compared to ls -d is that if there’s no non-hidden file in there, it will print /path/to/* while ls will give you an error about that file not existing instead.

To see just regular files —

Another way with tree , not mentioned here, it goes recursively and unlike find or ls you don’t have any errors (like: Permission denied , Not a directory ) you also get the absolute path in case you want to feed the files to xargs or other command

tree -fai /pathYouWantToList >listOfFiles.list 
-a All files are printed. By default tree does not print hidden files (those beginning with a dot `.'). In no event does tree print the file system constructs `.' (current directory) and `..' (previous directory). -i Makes tree not print the indentation lines, useful when used in conjunction with the -f option. -f Prints the full path prefix for each file. 

sudo apt install tree on Ubuntu/Debian

sudo yum install tree on CentOS/Fedora

sudo zypper install tree on OpenSUSE

@rogerdpack sudo apt install tree on Ubuntu sudo yum install tree on CentOS sudo zypper install tree on OpenSUSE

You can just use realpath or readlink this naughty way:

When ls prints to a TTY it formats the file names in columns, but when it’s writing to a file, pipe, or other non-TTY it behaves like ls -1 and prints one file name per line. You can check this by running ls | cat in place of ls . [1]

  • xargs build and execute command lines from standard input.
  • realpath : return the canonicalized absolute pathname
  • readlink : read value of a symbolic link
  • Use realpath — to make it treat everything that follows as parameters instead of options, if files could have » -something «.
  • If some files have spaces you could:

@rogerdpack do you have coreutils package installed? I get that info with dpkg -S /usr/bin/realpath . Check out this.

In a past Linux environment, I had a resolve command that would standardize paths, including making a relative path into an absolute path. I can’t find it now, so maybe it was written by someone in that organization.

You can make your own script using functions in the Python or Perl standard libraries (and probably other languages too).

#!/bin/env python import sys import os.path for path in sys.argv: print os.path.abspath(path) 
#!/bin/env perl use warnings; use Cwd qw ( abs_path ); foreach (@ARGV)

Then, you would solve your problem with:

resolve.py * > listOfFiles.list 

With this command, you can also do things like this:

cd /root/dir1/dir2/dir3 resolve.py ../../dir4/foo.txt # prints /root/dir1/dir4/foo.txt 

Recursive files can be listed by many ways in linus. Here i am sharing one liner script to clear all logs of files(only files) from /var/log/ directory and second check recently which logs file has made an entry.

find /var/log/ -type f #listing file recursively 
for i in $(find $PWD -type f) ; do cat /dev/null > "$i" ; done #empty files recursively 
ls -ltr $(find /var/log/ -type f ) # listing file used in recent 

note: for directory location you can also pass $PWD instead of /var/log.

I find bash find $(pwd) works well. Also, ls | xargs realpath works. You can add any other flags to the latter example as well as the first.

To list the full path of all commands (apps/programs) accessible to the user. (revised to address most, but not all limitations outlined in the comments)

eval ls -d $(echo $PATH | sed -e 's|^:|.:|' -e 's|:$|. |' -e 's|:|/[[:word:]]* |g') 2>/dev/null | sort 

NOTE
The PATH variable would normally have a colon ( : ) either at the beginning or at the end, but not both. A colon at the beginning or end signifies to search the current directory as well. Standard practice is for it to be at the end so as to never override standard utility programs. The sed substitutions here handle either case.

Explanation.

ls: cannot access ‘./[[:word:]]‘: No such file or directory
ls: cannot access ‘/home/alpha/bin/[[:word:]]
‘: No such file or directory
ls: cannot access ‘/usr/local/sbin/[[:word:]]‘: No such file or directory
ls: cannot access ‘/usr/local/bin/[[:word:]]
‘: No such file or directory
ls: cannot access ‘/usr/sbin/[[:word:]]‘: No such file or directory
ls: cannot access ‘/usr/bin/[[:word:]]
‘: No such file or directory
ls: cannot access ‘/sbin/[[:word:]]‘: No such file or directory
ls: cannot access ‘/bin/[[:word:]]
‘: No such file ordirectory

  • ls -d
    List directories. The -d option doesn’t really just list directories. By appending /* to each directory (see below), we will get the contents of the directories.
  • $( . ) Perform the commands inside parens and replace the $( . ) with the results for ls to use.
    • $(echo :$PATH | sed -e ‘s|^:|.:|’ -e ‘s|:$|. |’ -e ‘s|:|/[[:word:]]* |g’)
      • Produces a space-separated list of directory patterns like.
      ./[[:word:]]* /home/alpha/bin/[[:word:]]* /usr/local/sbin/[[:word:]]* /usr/local/bin/[[:word:]]* /usr/sbin/[[:word:]]* /usr/bin/[[:word:]]* /sbin/[[:word:]]* /bin/[[:word:]]* 

      Источник

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