循环遍历目录

时间:2014-05-06 16:00:07

标签: bash

我有一个类似的目录结构,我循环遍历目录,但是得到错误无法找到目录任何想法?在第一个目录中它正在寻找dir1 dir2 dir3等等,在第二个dir1中它正在寻找dirA dir B和dirC谢谢。

   ./subtle1/
        /fooA/file.txt
        /fooB/file.txt
        /fooC/file.txt

   ./subtle2/
     /fooA/file.txt
     /fooB/file.txt
     /fooC/file.txt

for i in ~/new/subtle*;
       do
               if [ -d "$i" ] ; 
then
       cd $i

    for j in "$i"/foo* ; do

                if [ -d "$j" ] ; 
 then
       cd $j
            mv file.txt $i.$j.file.txt
 done
 done

3 个答案:

答案 0 :(得分:1)

立刻让我感到困惑的一个问题是你在循环中cd,并且在下一次迭代中你不会从该目录中出来。

所以你cd ~/new/subtle1/fooA进入pushd,做一些工作,然后在下一次迭代中你已经在那个目录中,而你想要在原来的(开始)点。

我会查看popd / pushdcd的工作方式与popd类似,但它维护着一堆访问过的目录,而$ pwd /home/brian $ pushd /var/log $ pwd /var/log $ popd $ pwd /home/brian 会将您带回到该堆栈中。

e.g。

{{1}}

答案 1 :(得分:1)

如果您只想改变文件名:

mv ./subtle1/fooB/file.txt ./subtle1/fooB/subtle1.fooB.file.txt
mv ./subtle1/fooA/file.txt ./subtle1/fooA/subtle1.fooA.file.txt
mv ./subtle1/fooC/file.txt ./subtle1/fooC/subtle1.fooC.file.txt
mv ./subtle2/fooB/file.txt ./subtle2/fooB/subtle2.fooB.file.txt
mv ./subtle2/fooA/file.txt ./subtle2/fooA/subtle2.fooA.file.txt
mv ./subtle2/fooC/file.txt ./subtle2/fooC/subtle2.fooC.file.txt

比你需要的只是:

find -type f -print|sed -r -e 's/\.\/(.+)\/(.+)\/(.+)/\0 .\/\1\/\2\/\1.\2.\3/'|xargs -n 2 mv

答案 2 :(得分:0)

如果您真的想通过脚本执行此操作并使用cd四处走动,请尝试以下操作:

#!/bin/bash

for sub in subtle*; do
  if [ -d "${sub}" ]; then
    cd ${sub}
    for foo in foo*; do
      if [ -d "${foo}" ]; then
        cd ${foo}
        pwd
        echo mv -- file.txt ${sub}.${foo}.file.txt
        cd ..
      fi
    done
    cd ..
  fi
done 

您可以删除pwdecho以执行mv