使用for循环将文件从子目录移动到父目录

时间:2014-03-06 15:23:40

标签: linux unix for-loop

我刚刚切换到linux,我正在尝试编写我的第一个bash脚本。我有一个包含大量文件夹的文件夹,所有文件夹都包含包含文件的子文件夹。类似的东西:

  • MainFolder

    • Folder1中
      • Sub1(包含许多文件)
      • Sub2(包含许多文件)
    • FOLDER2
      • Sub1(包含许多文件)
      • Sub2(包含许多文件)

    。 。

我想将子文件夹中包含的所有文件移动到其父文件夹。我的第一直觉是尝试编写一个for循环。我可以使用以下命令一次执行一个文件夹:

mv MainFolder/Folder1/*/* MainFolder/Folder1/

但我希望编写一个bash脚本来遍历主目录中的所有文件夹。以下是我到目前为止的情况:

#!/bin/bash

dir1="/pathto/MainFolder"

subs= ls $dir1

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

这显然不起作用,但我不明白我哪里出错了。

我也尝试过:

mv MainFolder/*/*/* MainFolder/*/

带来了相当糟糕的结果。一旦我让文件移动正常,我还想删除循环中的旧子文件夹。

3 个答案:

答案 0 :(得分:4)

小变化。改变

subs=ls $dir1

subs=`ls $dir1`

注意反引号。反引号实际上执行bash命令并返回结果。如果您在该行后发布echo $subs,则会发现它正确地列出了folder1folder2

第二个小改动是删除mv命令中的双引号。将它们更改为

mv $dir1/$i/*/* $dir1/$i

双引号采用文字文件名,而删除引号采用递归目录模式。

之后,你的初始for循环确实是正确的。它会将所有内容从sub1sub2移动到folder1等等。

答案 1 :(得分:0)

!/ bin / bash

dir1 =“ / pathto / MainFolder”

subs = ls $dir1

对于$ subs中的i;做

mv $ dir1 / $ i / / $ dir1 / $ i

完成

答案 2 :(得分:0)

是的-这是可行的解决方案

#!/bin/bash

mainDir="$(dirname $(realpath $0))/store/media"

subs=`ls $mainDir`

for i in $subs; do
    if [[ -d "$mainDir/$i" ]]; then
        mv "$mainDir/$i"/* "$mainDir/"
        rm -rf "$mainDir/$i"
    fi
done