0

我有一个这样的文件夹结构:一个名为 Photos 的大父文件夹。此文件夹包含 900 多个名为 a_000、a_001、a_002 等的子文件夹。

这些子文件夹中的每一个都包含更多子文件夹,名为 dir_001、dir_002 等。每个子文件夹都包含许多图片(具有唯一名称)。

我想将a_xxx 子目录中包含的所有这些图片移到a_xxx 中。(其中 xxx 可以是 001、002 等)

在查看了类似的问题之后,这是我想出的最接近的解决方案:

for file in *; do
  if [ -d $file ]; then
    cd $file; mv * ./; cd ..; 
  fi
done

我得到的另一个解决方案是做一个 bash 脚本:

#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`

for i in $subs; do
  mv $dir1/$i/*/* $dir1/$i/ 
done

仍然,我错过了一些东西,你能帮忙吗?

(那么丢弃空的dir_yyy会很好,但目前问题不大)

4

3 回答 3

3

您可以尝试以下 bash 脚本:

#!/bin/bash

#needed in case we have empty folders
shopt -s nullglob

#we must write the full path here (no ~ character)
target="/path/to/photos"

#we use a glob to list the folders. parsing the output of ls is baaaaaaaddd !!!!
#for every folder in our photo folder ... 
for dir in "$target"/*/
do
    #we list the subdirectories ...
    for sub in "$dir"/*/
    do
        #and we move the content of the subdirectories to the parent
        mv "$sub"/* "$dir"
        #if you want to remove subdirectories once the copy is done, uncoment the next line
        #rm -r "$sub"
    done
done

这就是为什么您不在 bash 中解析 ls 的原因

于 2016-11-07T16:50:56.103 回答
1

在以下脚本中确保文件所在的目录正确(且完整)并尝试:

#!/bin/bash
BigParentDir=Photos

for subdir in "$BigParentDir"/*/; do    # Select the a_001, a_002 subdirs
  for ssdir in "$subdir"/*/; do         # Select dir_001, … sub-subdirs
    for f in "$ssdir"/*; do             # Select the files to move
      if [[ -f $f ]]; do                # if indeed are files
         echo \
         mv "$ssdir"/* "$subdir"/       # Move the files.
      fi
    done
  done      
done

不会移动任何文件,只会打印。如果您确定脚本执行您想要的操作,请注释 echo 行并“真正地”运行它。

于 2016-11-07T16:49:13.067 回答
1

你可以试试这个

#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`

cp /dev/null /tmp/newscript.sh

for i in $subs; do
  find $dir1/$i -type f -exec echo mv \'\{\}\' $dir1/$i \; >> /tmp/newscript.sh
done

然后/tmp/newscript.sh用编辑器打开,或者less看看是否看起来像你想要做的。

如果确实如此,则执行它sh -x /tmp/newscript.sh

于 2016-11-07T16:55:51.400 回答