shell must parse ls -Al output and get last field (file or directory name) ANY SOLUTION
How about thisls -Al |awk '{$1=$2=$3=$4=$5=$6=$7=$8="";print $0}'
I know it's a cheap trick but since you don't want to use anything other than ls -Al
I cant think anything better...
Get most recent file in a directory on Linux
ls -Art | tail -n 1
This will return the latest modified file or directory. Not very elegant, but it works.
Used flags:
-A
list all files except .
and ..
-r
reverse order while sorting
-t
sort by time, newest first
How to split a string in shell and get the last field
You can use string operators:
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
This trims everything from the front until a ':', greedily.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
How to find the last field using 'cut'
You could try something like this:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Explanation
rev
reverses "maps.google.com" to bemoc.elgoog.spam
cut
uses dot (ie '.') as the delimiter, and chooses the first field, which ismoc
- lastly, we reverse it again to get
com
get the first word as result of ls -l
If you have only one row to output, this will work fine:
var=`ls -l | awk '{ print $9 }'`
echo ${var}
Or you need to use grep
to filter your output for the correct file.
How to get the list of files in a directory in a shell script?
search_dir=/the/path/to/base/dir
for entry in "$search_dir"/*
do
echo "$entry"
done
Get last field using awk substr
Use the fact that awk
splits the lines in fields based on a field separator, that you can define. Hence, defining the field separator to /
you can say:
awk -F "/" '{print $NF}' input
as NF
refers to the number of fields of the current record, printing $NF
means printing the last one.
So given a file like this:
/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename
This would be the output:
$ awk -F"/" '{print $NF}' file
filename
filename
filename
How to loop over files in directory and change path and add suffix to filename
A couple of notes first: when you use Data/data1.txt
as an argument, should it really be /Data/data1.txt
(with a leading slash)? Also, should the outer loop scan only for .txt files, or all files in /Data? Here's an answer, assuming /Data/data1.txt
and .txt files only:
#!/bin/bash
for filename in /Data/*.txt; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
done
done
Notes:
/Data/*.txt
expands to the paths of the text files in /Data (including the /Data/ part)$( ... )
runs a shell command and inserts its output at that point in the command linebasename somepath .txt
outputs the base part of somepath, with .txt removed from the end (e.g./Data/file.txt
->file
)
If you needed to run MyProgram with Data/file.txt
instead of /Data/file.txt
, use "${filename#/}"
to remove the leading slash. On the other hand, if it's really Data
not /Data
you want to scan, just use for filename in Data/*.txt
.
Related Topics
Youcompleteme Can't Find Local Header Files
Text Encoding Between Linux and Windows
Udev-How to Get Value of a Child Device Attributes
Bash - Ignore Hidden Files and Empty Source Directory When Copying
Git Wont Reset File Permissions Over Cifs Mount
Does Zgrep Unzip a File Before Searching
How to Get Argv from "Struct Linux_Binprm"
Sublime Text 2 Build (Ctrl +B) Intel Fortran Compiler
Reading Microphone Data by Polling Using Alsa [Or V4L2]
Openldap Naming Context Issue with Apache Directory Studio
Compare Two Files of Different Columns and Print Different Columns
Simpler Way to Repeatedly Read Lines and Invoke a Program
Aosp Build Error: Unrecognized Module Type "Hidl_Package_Root"
Git Is Not Ignoring File Permission Changes
Karma Not Found from Maven After Re-Install
Find String Inside PDF with Shell
Start Tomcat from Eclipse in Port 80 in Ubuntu with Authbind