循环遍历使用bash

时间:2016-07-19 19:20:03

标签: bash

我是写新bash的新手,我确信我正在努力做到这一点,所以如果有人能帮我减少我的代码或告诉我哪些错误会很棒。

我正在尝试遍历主目录以及查找文件名的子目录并将其分解,以便我可以从文件名中提取部分。

我的目录结构是这样的,这只是一个例子。文件夹如" 0000"会有所不同

/images/0000/somefilename1_this.jpg
/images/1111/somefilename2_this.jpg
/images/2222/somefilename3_this.jpg
/images/3333/somefilename4_this.jpg

我的脚本运行正常,直到我到FINALIFS='_' read -ra FINALNAME <<< "$FINALSTR";我试图用下划线爆炸文件名并将其放入数组中。当我echo ${FINALNAME[0]};时它是空的。在最后for done我得到了一个synax错误,如果我注释掉最后for done我不再收到语法错误。

我的最终目标是将部分文件名及其当前目录放入变量中,以便稍后我可以做一些事情。

0000 somefilename1
1111 somefilename2
2222 somefilename3
3333 somefilename4

任何帮助都将不胜感激。

for d in */ ; do
   for file in "$d"*.jpg ; do
      STR="$file";
      IFS='/' read -ra SPLITNAMES <<< "$STR";
      for i in "${SPLITNAMES[1]}"; do
         FINALSTR="$i";
         FINALIFS='_' read -ra FINALNAME <<< "$FINALSTR";
         echo ${FINALNAME[0]}; <-- this is empty
         for b in "${FINALNAME[0]}"; do

         done <-- I get a syntax error here
      done
      # mkdir /images/$d$(date '+%Y-%m-%d');
      # mv /images/$d$(date '+%Y-%m-%d')_* /images/$d$(date '+%Y-%m-%d');
   done
done

2 个答案:

答案 0 :(得分:2)

您可以使用randomized = (1..100).to_a.sample(10) #=> [52, 100, 92, 93, 33, 66, 78, 84, 36, 98] 简化脚本,然后使用下划线和正斜杠使用find进行拆分:

read

答案 1 :(得分:0)

find可以胜任

#!/bin/bash
if [ ! -d "$1" ] # Checking if the directory entered as argument1 exists
then
echo " $1 Not a valid directory"
exit 1
fi
filename_processor() # This is a bash function
{
 temp1=${@##*/}
 temp2=${@%/*}
 echo "${temp2##*/} ${temp1%%_*}"
}
export -f filename_processor
find "$1" -type f -name "*.jpg" -name ".html" \
     -exec bash -c 'filename_processor "$1"' _ {} \;

<强>参考

  1. 找到[ manpage ]
  2. Shell参数[ expansion ]