- List files recursively in Linux CLI with path relative to the current directory
- 14 Answers 14
- The Linux LS Command – How to List Files in a Directory + Option Flags
- Prerequisites
- The Linux ls Command
- How to list Files in a Directory with Options
- List files in the current working directory
- List files in another directory
- List files in the root directory
- List files in the parent directory
- List files in the user’s home directory (/home/user)
- List only directories
- List files with subdirectories
- List files recursively
- List files with their sizes
- List files in long format
- List files in long format with readable file sizes
- List files including hidden files
- List files in long format including hidden files
- List files and sort by date and time
- List files and sort by file size
- List files and output the result to a file
- Conclusion
- Recursively list files with file names, folder names and permission
- 5 Answers 5
- Make a list of filenames [duplicate]
- 3 Answers 3
List files recursively in Linux CLI with path relative to the current directory
This is similar to this question, but I want to include the path relative to the current directory in unix. If I do the following:
test1/file.txt test2/file1.txt test2/file2.txt
file.txt file1.txt file2.txt
How can I get it to include the paths relative to the current directory using standard Unix commands?
It’s a shame all of these solutions require find or tree . I’m ssh’ing into an android device where I appear to only have ls , and none of these other tools :/
14 Answers 14
On systems that use GNU find, like most GNU/Linux distributions, you can leave out the -print.
If pattern has part of the directory name should use -path «*docs/*.txt» instead of -name . -wholename is same as -path
Use tree , with -f (full path) and -i (no indentation lines):
tree -if --noreport . tree -if --noreport directory/
You can then use grep to filter out the ones you want.
If the command is not found, you can install it:
Type following command to install tree command on RHEL/CentOS and Fedora linux:
If you are using Debian/Ubuntu, Mint Linux type following command in your terminal:
$ sudo apt-get install tree -y
Try find . You can look it up exactly in the man page, but it’s sorta like this:
find [start directory] -name [what to find]
should give you what you want.
You could use find instead:
To get the actual full path file names of the desired files using the find command, use it with the pwd command:
ls -R1 $PWD | while read l; do case $l in *:) d=$;; «») d=;; *) echo «$d/$l»;; esac; done | grep -i «.txt»
But it does that by «sinning» with the parsing of ls , though, which is considered bad form by the GNU and Ghostscript communities.
@CAFEBABE: it is considered taboo to parse the results of ls because it generally leads to bugs. The sentence in question was trying to call that out. It also had a joke in it that I have removed.
DIR=your_path find $DIR | sed 's:""$DIR""::'
‘sed’ will erase ‘your_path’ from all ‘find’ results. And you recieve relative to ‘DIR’ path.
sub format_lines($) < my $refonlines = shift; my @lines = @; my $tmppath = "-"; foreach (@lines) < next if ($_ =~ /^\s+/); if ($_ =~ /(^\w+(\/\w*)*):/) < $tmppath = $1 if defined $1; next; >print "$tmppath/$_"; > > sub main() < my @lines = (); while (<>) < push (@lines, $_); >format_lines(\@lines); > main();
ls -LR | perl format_ls-LR.pl
This is a terrible Perl program. It’s probably 2-3 times as long, and complicated, than it needs to be.
You could create a shell function, e.g. in your .zshrc or .bashrc :
The first one would work on single files only, obviously.
Find the file called «filename» on your filesystem starting the search from the root directory «/». The «filename»
If you want to preserve the details come with ls like file size etc in your output then this should work.
sed "s|||g" input_file > output_file
In the fish shell, you can do this to list all pdfs recursively, including the ones in the current directory:
Just remove ‘pdf’ if you want files of any type.
You can implement this functionality like this
Firstly, using the ls command pointed to the targeted directory. Later using find command filter the result from it. From your case, it sounds like — always the filename starts with a word file***.txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)
The Linux LS Command – How to List Files in a Directory + Option Flags
Bolaji Ayodeji
Since the creation of Unix in the 1970s, a lot of operating systems have used it as their foundation. Many of these operating systems failed, while others succeeded.
Linux is one of the most popular Unix based operating systems. It’s open source, and is used all over the world across many industries.
One amazing feature of the Linux operating system is the Command Line Interface (CLI) which allows users to interact with their computer from a shell. The Linux shell is a REPL (Read, Evaluate, Print, Loop) environment where users can enter a command and the shell runs it and returns a result.
The ls command is one of the many Linux commands that allow a user to list files or directories from the CLI.
In this article, we’ll go in depth on the ls command and some of the most important flags you’ll need day-to-day.
Prerequisites
- A computer with directories and files
- Have one of the Linux distros installed
- Basic knowledge of navigating around the CLI
- A smile on your face 🙂
The Linux ls Command
The ls command is used to list files or directories in Linux and other Unix-based operating systems.
Just like you navigate in your File explorer or Finder with a GUI, the ls command allows you to list all files or directories in the current directory by default, and further interact with them via the command line.
Launch your terminal and type ls to see this in action:
How to list Files in a Directory with Options
The ls command also accepts some flags (also known as options) which are additional information that changes how files or directories are listed in your terminal.
In other words, flags change how the ls command works:
PS: The word contents used in throughout the article refers to the files and directories being listed, not the actual contents of the files/directories ?
List files in the current working directory
Type the ls command to list the contents of the current working directory:
List files in another directory
Type the ls [directory path here] command to list the contents of another directory:
List files in the root directory
Type the ls / command to list the contents of the root directory:
List files in the parent directory
Type the ls .. command to list the contents of the parent directory one level above. Use ls ../.. for contents two levels above:
List files in the user’s home directory (/home/user)
Type the ls ~ command to list the contents in the users’s home directory:
List only directories
Type the ls -d */ command to list only directories:
List files with subdirectories
Type the ls * command to list the contents of the directory with it’s subdirectories:
List files recursively
Type the ls -R command to list all files and directories with their corresponding subdirectories down to the last file:
If you have a lot of files, this can take a very long time to complete as every single file in each directory will be printed out. You can instead specify a directory to run this command in, like so: ls Downloads -R
List files with their sizes
Type the ls -s command (the s is lowercase) to list files or directories with their sizes:
List files in long format
Type the ls -l command to list the contents of the directory in a table format with columns including:
- content permissions
- number of links to the content
- owner of the content
- group owner of the content
- size of the content in bytes
- last modified date / time of the content
- file or directory name
List files in long format with readable file sizes
Type the ls -lh command to list the files or directories in the same table format above, but with another column representing the size of each file/directory:
Note that sizes are listed in bytes (B), megabytes (MB), gigabytes (GB), or terabytes (TB) when the file or directory’s size is larger than 1024 bytes.
List files including hidden files
Type the ls -a command to list files or directories including hidden files or directories. In Linux, anything that begins with a . is considered a hidden file:
List files in long format including hidden files
Type the ls -l -a or ls -a -l or ls -la or ls -al command to list files or directories in a table format with extra information including hidden files or directories:
List files and sort by date and time
Type the ls -t command to list files or directories and sort by last modified date in descending order (biggest to smallest).
You can also add a -r flag to reverse the sorting order like so: ls -tr :
List files and sort by file size
Type the ls -S (the S is uppercase) command to list files or directories and sort by size in descending order (biggest to smallest).
You can also add a -r flag to reverse the sorting order like so: ls -Sr :
List files and output the result to a file
Type the ls > output.txt command to print the output of the preceding command into an output.txt file. You can use any of the flags discussed before like -la — the key point here is that the result will be outputted into a file and not logged to the command line.
Then you can use the file as you see fit, or log the contents of the file with cat output.txt :
Conclusion
There are tons of other commands and combinations you can explore to list out files and directories based on your needs. One thing to remember is the ability to combine multiple commands together at once.
Imagine you want to list a file in long format, including hidden files, and sort by file size. The command would be ls -alS , which is a combination of ls -l , ls -a , and ls -S .
If you forget any command or are unsure about what to do, you can run ls —help or man ls which will display a manual with all possible options for the ls command:
Recursively list files with file names, folder names and permission
Is there anyway I can list files by typing a command in the shell which lists all the file names, folder names and their permissions in CentOS?
Hi, thanks for the reply. Yes for example, if I have the following structure: Folder A > File 1, File 2, Folder AA [File AA1, File AA2] etc, so I wish to list all folders and all files inside these folders along with their permissions in a text file. I hope that makes sense?
5 Answers 5
Have a look at tree, you may have to install it first. Per default tree does not show permissions, to show permissions next to the filename run
which will recursively list all folders and directories within the current directory including permissions.
ls -lR lists the contents of directories recursively. The output is hard to process automatically, but for manual browsing it may be good because it’s what you’re familiar with.
The find command lists files recursively. You can customize its output, for example the following command prints permissions like ls -l does before each file name:
This output can be processed mechanically if there are no newlines in your file names. If you replace \n (newline) by \000 (null byte), you can process the output with tools that support null-separated records.
Both ls and find only print traditional unix permissions, not access control lists. For a recursive listing of all file permissions including ACL information, run
The output can be processed mechanically (special characters are sorted); in particular, it can be fed to setfacl —restore to replicate the permissions to another tree with the same file names.
Make a list of filenames [duplicate]
I’m looking for an easy way to build a list in a txt file of the filenames inside a given directory. Filenames only preferred, though I could trim other fields if necessary.
The post named in comment above wanted subfolders, path, size, and creation (or last modified) date . The original question for this post wanted none of that, just names.
3 Answers 3
This command should be helpful:
find -maxdepth 1 -type f ! -name flist.txt -printf "%P\n" > flist.txt
- -maxdepth : Don’t search for files below folders of one level down.
- type f : Search for only files
- -printf «%P\n» : Print the names only and on separate lines
- > flist.txt : Store those names (using output redirection) in a file to be created on the fly called `flist.txt
- ! -name flist.txt : Skips the name of the output file from the generated list
The ls (list) command executed in a terminal window is the key, and its man page lists options.
Let’s say you are in your home directory, and you want a list of all the files in directory /x/y . The command would be
for the -b option lists all files even with spaces, -1 (number one, not letter l) option of ls will list with one line per file name, and -A will make sure hidden files are shown, but not directories.
In terminal, change directory to the required folder, then use the command:
This will redirect a list of the contents of the folder to the text file files.txt . You didn’t indicate what form the contents of the folder takes. If there are sub-folders present, in addition to a group of files, the folder names will also be included. But, once you have the text version you can sort/edit it any way you desire.
ls omits “hidden” dot files (unless instructed otherwise) and mangles file names with some unusual characters. Don’t use it to list file names for anything but display to a human reader. -1
Many people don’t like this solution and downvote the answer — which is their prerogative. However, I would point out that the OP asked for an «easy way» to list files. Some of us have simple folder structures. We don’t have concerns with hidden files. And, I did realize that the simple command would include files.txt, but I did say that the result could be edited. Anyway, for what it’s worth, that’s the simple-minded way I do things.