如何将变量(文件夹列表)传递给for循环?

时间:2012-05-11 14:02:05

标签: bash for-loop

我是Linux的新手,也是编程的初学者,但已经能够将几行代码here拼凑在一起,用于将文件列表传递给for循环,并且{{ 3}}用于对文件夹执行相同操作。

# Run search.sh from base folder; 
# Only interested in folders under base folder (e.g., baseFolder/FolderA)
# list all folders in base directory that match search parameters;
# cut out just the folder name; feed to variable DIR

 DIR=$(find . -name *MTL.txt | cut -d '/' -f2)

# echo $DIR = "FolderA FolderB FolderC"
# place that information in a for-loop

    for i in $DIR; do

      cd $DIR # step into folder

      # find specific file in folder for processing
      FILE=$(find -name *MTL | cut -d '/' -f2)

      # copy in a static file from another folder;
      # rename file based on file name found in previous step
      cp /baseFolder/staticfile.txt $FILE.new
      do more stuff

      cd .. # step out of directory

     done

第一个目录的代码完好无损,但无法移入后续目录。我猜我的(很多)问题之一就是我不能像我一样将文件夹名称列表传递给$ DIR。这应该很简单,但我的foo很弱。

请告诉我,告诉我。

编辑:

将“cd $ DIR”更改为“cd $ i”具有所需的效果。代码现在遍历所有目录并在每个目录中正确执行操作。 -Thx to core1024用于标记上述内容。

5 个答案:

答案 0 :(得分:4)

  

cd ..#step out of directory

只需升级一级。

在循环之前,您需要将“基本目录”存储在变量中:

BASEDIR=`pwd`

然后,你将执行

cd $BASEDIR # step out of directory

而不是你当前的

  

cd ..

答案 1 :(得分:1)

我不是专家,但我认为cd $DIR # step into folder应该是cd $i # step into folder

答案 2 :(得分:0)

不需要" For循环"虽然。 find命令将遍历它找到的所有项目。

在find命令上有一个-exec选项,用于传递每个项目"找到"一个特定的命令。

e.g。

find . -name *MTL.txt -exec cp {} /basefolder \;

这会将找到的所有文件复制到/ basefolder

如果你对使用for循环感到强烈,你也可以使用命令的输出作为循环列表。

e.g。

for MYVAR in `ls *.txt* `
do
    echo $MYVAR
done

使用剪切通常不是一个好主意,除非您正在格式化输出或具有不将其输出发送到stdout的命令。

答案 3 :(得分:0)

以下内容稍微简单一点,因为它不需要解析find输出:

for subdir in *; do
  if [[ ! -d $subdir ]]; then
    continue
  fi

  cd $subdir
  for f in *MTL.txt; do
    cp /baseFolder/staticFile.txt $f.new
    # And whatever else
  done

  cd ..
done

请注意,我只会下载到每个子目录中一次,原始代码会多次执行此操作。我指出这是为了你的意图。此外,由于您的cut命令阻止您访问多个目录,我认为这是您的意图。

根据您执行的其他操作,您可以完全避免更改目录。例如:

for f in $subdir/*MTL.txt; do
  cp /baseFolder/staticFile.txt $f.new
  # More stuff
done

答案 4 :(得分:0)

如果目录名具有嵌入空格,则原始代码将中断。如果您有多个文件满足目录中的查找条件,您还将重复该操作。 替代方法:

IFS='
'
declare -a DIR
declare -a FILE
DIR=($(find . -name '*MTL.txt' | cut -f2 -d '/' | uniq))
for x in "${DIR[@]}"
 do
   if [ -d "$x" ];  then
     pushd "$x"
        FILE=($(ls *MTL))
        for y in "${FILE[@]}"
          do
            cp /baseFolder/staticfile.txt  "$y"
            echo do more stuff
          done
     popd
   fi
 done