我在文件夹中有几个文件,例如。在 home 目录中。现在,我想要一个bash脚本,该脚本通过所有文件循环并执行每个文件的命令(命令使用文件名)。
我该怎么做?
for file in *;
do
echo $file
done
类似的东西可能会帮助您入门:
for file in /home/directory/*; do
filename=${file##*/}
echo "$filename"
##execute command here with $filename
done
如果该目录中也有文件夹,则需要检查文件:
for..do
之后立即添加此行:
[[ ! -f $file ]] && continue
如果您想忽略符号链接,则:
[[ ! -f $file || -L $file ]] && continue
附加(根据评论):
您可以检查字符串(蒙版)是否在文件名中:
if [[ $filename == *mask* ]];then
echo it's there
else
echo It's not there
fi
您可以像这样修改文件名:
#assuming you want to add mask before the extension
newfilename="${filename%%.*}_mask${filename#*.}"
echo "$newfilename"
${filename%%.*}
是$filename
的一部分,没有扩展名
${filename#*.}
是$filename
如果您只想在文件上迭代,则:
find <your-dir> -type f | xargs <your-cmd>
例如,如果您想更改当前目录中仅文件的访问权限(但请将所有目录保留未触及):
find . -type f | xargs -n 1 chmod u+rw
-n 1
部分告诉xargs
分别调用每个目录的chmod
(在这种情况下这不是最有效的,但您应该得到这个想法)。
有几种方法:
- 使用
xargs
xargs
对于从 stdin
获取列表很有用,并将每个列表与命令一起使用,示例:
ls yourdir/ | xargs yourcmd
- 使用
for
循环
循环可以与单词列表或通配符一起使用,例如:
for i in *; do yourcmd $i ; done
# for i in `ls youdir`; do yourcmd $i ; done # Never do that
- 使用
find
find
允许在一个命令中进行示例(来自gnu find Man):
find . -type f -exec file '{}' ;
在当前目录中的每个文件上运行"文件"。注意 牙套被封闭在单引号中,以保护它们免受 解释为外壳脚本标点符号。分号是类似的 尽管';'可能是 在这种情况下也使用。