大家好我的脚本有些问题。我已经读过,从脚本中更改当前目录是一个问题。基本上我正在寻找一个带有项目文件夹和其中任何子文件夹的php文件。我想将目录更改为该文件夹所在的位置并为其执行命令。到目前为止没有运气。
function findPHP(){
declare -a FILES
FILES=$(find ./ -name \*.php)
for file in "${FILES[@]}"
do
DIR=`dirname file`
( cd $DIR && doSomethingInThisDir &(...))
done
非常感谢任何帮助。
答案 0 :(得分:3)
您尝试将FILES
作为数组进行迭代,但它只有一个元素。为了将子shell的结果变为数组,您可以:
FILES=($(find ./ -name \*.php))
请注意,它会在空格上分割文件名,因此即使您在下面正确引用,也无济于事。或者,你可以让它分成下面(即使用现有的FILES
)并改为使用:
for file in $FILES
如果您使用的是bash 4
,您可能需要查看递归的globbing ...这会让它更容易一些:
for file in **/*.php
请注意,您必须设置globstar
shell选项,您可以使用shopt -s globstar
启用该选项。这种方式更简单,不会在空格上破坏。
此外,您可能需要$file
:
DIR=`dirname $file`
或者只使用参数扩展:
DIR=${file%/*}
答案 1 :(得分:1)
无论如何都没有理由使用数组或存储文件列表。如果您的find
支持-execdir
(例如gnufind 4.2.27),请使用它。否则,像你一样在子shell中执行cd:
#!/bin/bash
doSomethingInThisDir() ( cd $(dirname $1); ... )
export -f doSomethingInThisDir
find . -type f -exec bash -c 'doSomethingInThisDir {}' \;
我已使用()
而不是{}
定义了该功能,但在这种情况下这不是必需的。通常,使用()
会导致函数在子shell中运行,但无论如何都会发生这种情况,因为find为每个文件运行一个单独的进程。