在bash-scipt中加载具有相同文件名的不同文件夹中的多个文件

时间:2017-01-16 09:31:06

标签: bash ubuntu

到目前为止,我可以使用以下方式从我的Ubuntu上的单个文件夹中读取文件:

for i in /path/to/files/Folder1/*.pcd 
  do
    if [ ! -z $last_i ]
  then  
    ./vapp $last_i $i
  fi
  last_i="$i" 
done

这将读取Folder1中的所有文件。我还有文件夹2和3(即Folder2,Folder3)。每个文件夹里面有几个100个文件,这些文件只是编号,例如0000.pcd,0001.pcd ... 0129.pcd ......等等。

我尝试过使用

/path/to/files/Folder{1..3}/*.pcd 

问题是它现在需要来自一个文件夹的所有文件并处理其中的两个文件,而不是以相同的方式遍历该文件夹中的所有文件,然后再转到下一个文件夹。

我真正想要的是从我的三个文件夹中取出第i个文件夹,例如000i.pcd并将它(包括路径)传递给我的应用程序进行一些计算。

有效地我想这样做:

./vapp /Folder1/000i.pcd /Folder2/000i.pcd /Folder3/000i.pcd

2 个答案:

答案 0 :(得分:0)

仅使用原生files: "/etc/httpd/conf.d/allow_override.conf": mode: "000644" owner: ec2-user group: ec2-user encoding: plain content: | <Directory /var/www/html/www/ /> AllowOverride AuthConfig </Directory> "/etc/httpd/conf.d/auth.conf": mode: "000644" owner: ec2-user group: ec2-user encoding: plain content: | <Directory /var/www/html/www/ /> AuthType Basic AuthName "Myproject Prototype" AuthUserFile /etc/httpd/.htpasswd Require valid-user </Directory> "/etc/httpd/.htpasswd": mode: "000644" owner: ec2-user group: ec2-user encoding: plain content: | admin:lala 功能及其扩展的bash功能。从glob

运行脚本
/path/to/files/

wonderful answer重复使用#!/bin/bash shopt -s globstar nullglob dotglob i=0 end=129 while [ "$i" -le "$end" ] do # Generating the file-name to be generated, the numbers 0-129 # with 4 character padding, taken care by printf file="$(printf "%04d.pcd" $i)" # The ** pattern enabled by globstar matches 0 or more directories, # allowing the pattern to match to an arbitrary depth in the current # directory. fileList=( **/"$file" ) # Remember to un-comment the below line and see if the required files # are seen by doing # printf "%s\n" "${fileList[@]}" # and run the executable below ./vapp "$(printf "%s " "${fileList[@]}")" done 功能。

答案 1 :(得分:0)

我昨天以与Inian建议类似的方式解决了我的问题。除了我的方式是手动方式! 它适用于我,但我同意Inian的方式更灵活。无论如何,这是我的解决方案:

j=0
leadingZeros1="00000000"
leadingZeros2="0000000"
leadingZeros3="000000"

fol0="lidar03_00/"
fol1="lidar03_01/"
fol2="lidar03_02/"
ext=".pcd"
basepath="/my/path/"

for i in /my/path/lidar03_00/*.pcd
do

if [ ! -z $last_i ]
((j+=1))
then   

    if [ $j -le 9 ]   
then       
    mypath1=$basepath$fol0$leadingZeros1$j$ext
    mypath2=$basepath$fol1$leadingZeros1$j$ext
    mypath3=$basepath$fol2$leadingZeros1$j$ext       
    fi
    sleep .009

    if [ $j -ge 10 ]
    then
  if [ $j -le 99 ]
  then       
  mypath1=$basepath$fol0$leadingZeros2$j$ext
  mypath2=$basepath$fol1$leadingZeros2$j$ext
  mypath3=$basepath$fol2$leadingZeros2$j$ext     
  fi

  if [ $j -ge 100 ]
  then
    if [ $j -le 999 ]; then       
    mypath1=$basepath$fol0$leadingZeros3$j$ext
    mypath2=$basepath$fol1$leadingZeros3$j$ext
    mypath3=$basepath$fol2$leadingZeros3$j$ext

    fi;
  fi

fi
#echo $mypath1
#echo $mypath2
#echo $mypath3

 ./vapp -i $mypath1 $mypath2 $mypath3 .txt"    
fi
last_i="$i"
done

我承认,这不是最好的解决方案,但它现在解决了我的问题。如果我需要再次这样做,我可能会以Inian的方式做到这一点。 谢谢大家的帮助。 我试图避免嵌套ifs使用逻辑AND(&amp;&amp;)但不知何故它没有工作,我不想花更多的时间在这上面。这样笨拙的方式......