递归移动的Bash脚本

递归移动的Bash脚本,bash,shell,Bash,Shell,我的目录结构如下: |--Photos |--2014-01-15 #2 |--IMG_0045.JPG |--IMG_0051.JPG |--2014-06-19 |--IMG_0078.JPG 请注意,一个文件夹的名称包含一个空格[2014-01-15 2]。我编写了一个bash脚本,使用以下方法仅移动所有文件夹中的*.JPG文件: #!/bin/bash for i in $(ls); do if [ -

我的目录结构如下:

|--Photos  
   |--2014-01-15 #2  
      |--IMG_0045.JPG  
      |--IMG_0051.JPG  
   |--2014-06-19  
      |--IMG_0078.JPG  
请注意,一个文件夹的名称包含一个空格[2014-01-15 2]。我编写了一个bash脚本,使用以下方法仅移动所有文件夹中的*.JPG文件:

#!/bin/bash
for i in $(ls); do  
    if [ -d $i ]; then
        cd $i
        mv *.JPG /opt/data/tmp/
        cd -
    fi
done  
据我所知,由于分词,脚本没有进入包含空格的文件夹

是否可以编写bash脚本来从所有文件夹中移动*.JPG文件?

只需mv*/*。JPG/opt/data/tmp将按您的要求执行

您的脚本有两个常见的初学者错误。你需要而且应该这样做

就个人而言,我还建议不要在大多数脚本中使用cd

如果您需要在其他脚本中的目录上循环,对于i in./*/;做是这样的


如果您需要递归任意深度嵌套的目录,find就会这样做。使用GNU find和GNU mv,find dir-type f-name'*.JPG'-exec mv-t/opt/data/tmp{}+

噢,在fortriplee之后您错误地输入了i,您的解决方案完全符合我的要求-谢谢您,也感谢您提供的额外建议。已编辑以更正为之后的错误键入。