2017-01-16 1 views
1

До сих пор я могу читать файлы из одной папки на моей Ubuntu с помощью:загрузки нескольких файлов из разных папок с таким же именем файла в Баш-scipt

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 
+0

Вам понадобятся вложенные петли, например. ('for i in /path/to/Folders{1..3}, для j в« $ i »/ *; do ... stuff на« $ j »...; done; done') –

ответ

0

bash Использование собственных функций в одиночку, с его расширенными glob функциями. Запуск сценария из /path/to/files/

#!/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 

Использование extglob функций повторно используются с этой wonderful answer.

0

Я решил свою проблему вчера аналогично тому, что предложил Инян. За исключением того, что мой путь - это ручной способ! Это работает для меня, но я согласен с тем, что способ Иниана намного более гибкий. Вот мое решение в любом случае:

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 

Я признаю, это не самый хороший решение, но оно фиксирует мою проблему сейчас. Если мне нужно будет сделать это снова, я, вероятно, сделаю это по-китайски. Спасибо всем за помощь. Я попытался избежать вложенных ifs с помощью логического И (& &), но почему-то это не сработало, и я не хотел тратить больше времени на это. Таким образом, неуклюжий способ ...