Linux Shell Script For Each File in a Directory Grab the filename and execute a program
bash:
for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
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
.
Execute command on all files in a directory
The following bash code will pass $file to command where $file will represent every file in /dir
for file in /dir/*
do
cmd [option] "$file" >> results.out
done
Example
el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Bash script to iterate files in directory and pattern match filenames
The easiest way is probably just to iterate each group separately. This side-steps the parsing issue entirely.
DIRECTORY=.
for i in $DIRECTORY/YYYYMMDD_*_bulk_import.csv; do
# Process $i
done
for i in $DIRECTORY/YYYYMMDD_*_genstats_import.csv; do
# Process $i
done
for i in $DIRECTORY/YYYYMMDD_*allstats.csv; do
# Process $i
done
Set DIRECTORY
to whatever directory you want to search. The default .
will search the current working directory.
Shell Script to list files in a given directory and if they are files or directories
Your line:
for file in $dir; do
will expand $dir
just to a single directory string. What you need to do is expand that to a list of files in the directory. You could do this using the following:
for file in "${dir}/"* ; do
This will expand the "${dir}/"*
section into a name-only list of the current directory. As Biffen points out, this should guarantee that the file list wont end up with split partial file names in file
if any of them contain whitespace.
If you want to recurse into the directories in dir
then using find
might be a better approach. Simply use:
for file in $( find ${dir} ); do
Note that while simple, this will not handle files or directories with spaces in them. Because of this, I would be tempted to drop the loop and generate the output in one go. This might be slightly different than what you want, but is likely to be easier to read and a lot more efficient, especially with large numbers of files. For example, To list all the directories:
find ${dir} -maxdepth 1 -type d
and to list the files:
find ${dir} -maxdepth 1 -type f
if you want to iterate into directories below, then remove the -maxdepth 1
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
For files in directory, only echo filename (no path)
If you want a native bash
solution
for file in /home/user/*; do
echo "${file##*/}"
done
The above uses Parameter Expansion which is native to the shell and does not require a call to an external binary such as basename
However, might I suggest just using find
find /home/user -type f -printf "%f\n"
Related Topics
Linux's Thread Local Storage Implementation
Detecting Keyboard, Mouse Activity in Linux
How to Add Timestamp While Redirecting Stdout to File in Bash
Saving Gmon.Out Before Killing a Process
Difference Between $@ and $* in Bash Script
Is Nice() Used to Change the Thread Priority or the Process Priority
Rename Files to Md5 Sum + Extension (Bash)
Add User to Group But Not Reflected When Run "Id"
How to Run a Command in a Chroot Jail Not as Root and Without Sudo
Why Does Zookeeper Not Use My Log4J.Properties File Log Directory
Munmap() Failure with Enomem with Private Anonymous Mapping
How to Install Anaconda/Miniconda on Linux Silently
How to Recursively Copy a Directory into Another and Replace Only the Files That Have Not Changed