bash脚本用于通过文件循环



我在文件夹中有几个文件,例如。在 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(在这种情况下这不是最有效的,但您应该得到这个想法)。

有几种方法:

  1. 使用xargs

xargs对于从 stdin获取列表很有用,并将每个列表与命令一起使用,示例:

    ls yourdir/ | xargs yourcmd
  1. 使用for循环

循环可以与单词列表或通配符一起使用,例如:

    for i in *; do yourcmd $i ; done
    # for i in `ls youdir`; do yourcmd $i ; done # Never do that
  1. 使用find

find允许在一个命令中进行示例(来自gnu find Man):

find . -type f -exec file '{}' ;

在当前目录中的每个文件上运行"文件"。注意 牙套被封闭在单引号中,以保护它们免受 解释为外壳脚本标点符号。分号是类似的 尽管';'可能是 在这种情况下也使用。

相关内容

  • 没有找到相关文章

最新更新