4

我是 Linux 的新手,也是编程的初学者,但是已经能够在这里修补几行代码 将文件列表传递给 for 循环,在这里对文件夹执行相同的操作。

# 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”具有预期的效果。代码现在循环遍历所有目录并在每个目录中正确执行操作。- 感谢 core1024 用于标记上述内容。

4

5 回答 5

4

cd .. # 跳出目录

只是提高了一个级别。

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

BASEDIR=`pwd`

然后,您将执行

cd $BASEDIR # step out of directory

而不是你现在的

光盘..

于 2012-05-11T14:05:02.850 回答
1

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

于 2012-05-11T17:16:27.367 回答
0

不过,不需要“For 循环”。find 命令已经循环遍历它找到的所有项目。

find 命令上有一个 -exec 选项,可将“找到”的每个项目传递给特定命令。

例如

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

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

如果您对使用 for 循环有强烈的感觉,您还可以使用命令的输出作为循环列表。

例如

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

除非您正在格式化输出或有一个不将其输出发送到标准输出的命令,否则使用 cut 通常不是一个好主意。

于 2012-05-11T14:42:51.530 回答
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
于 2012-05-11T14:42:59.260 回答
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
于 2012-05-11T19:01:11.020 回答