如何将文件从子文件夹移动到其父目录(unix,terminal)

时间:2016-11-07 15:38:15

标签: bash unix filesystems subdirectory file-move

我有一个像这样的文件夹结构: 一个名为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会很好,但目前没有太多问题)

3 个答案:

答案 0 :(得分:2)

您可以尝试以下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

Here is why you don't parse ls in bash

答案 1 :(得分: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

不会移动任何文件,只需打印即可。如果您确定该脚本可以执行您想要的操作,请对回显线进行注释并“以实际”方式运行它。

答案 2 :(得分: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

执行它