将文件从子目录移动到父目录的脚本

将文件从子目录移动到父目录的脚本

我正在寻找用于将文件从子目录移动到父目录的脚本

我的文件夹结构如下。

  • 文件夹 AI 里面有很多文件夹,分别名为 1、2、3、4、5...
  • 所有这些文件夹都包含另外 2 个名为 B 和 C 的文件夹。
  • B 和 C 包含我想上移一级的文件,然后删除文件夹 B 和 C。

提前感谢您通过此脚本为我提供的任何帮助

答案1

您可以使用:

find test/*/* -type d | xargs -n1  sh -c 'echo mv -b ${0}/* "$( dirname ${0})" ";" rm -rvf ${0} '

它只会在屏幕上打印如下输出:

mv -b test/1/B/file1 test/1/B/file2 test/1/B/file3 test/1 ; rm -rvf test/1/B
mv -b test/1/C/file1 test/1/C/file2 test/1/C/file3 test/1 ; rm -rvf test/1/C
mv -b test/2/B/file1 test/2/B/file2 test/2/B/file3 test/2 ; rm -rvf test/2/B
mv -b test/2/C/file1 test/2/C/file2 test/2/C/file3 test/2 ; rm -rvf test/2/C
mv -b test/3/B/file1 test/3/B/file2 test/3/B/file3 test/3 ; rm -rvf test/3/B
mv -b test/3/C/file1 test/3/C/file2 test/3/C/file3 test/3 ; rm -rvf test/3/C
mv -b test/4/B/file1 test/4/B/file2 test/4/B/file3 test/4 ; rm -rvf test/4/B
mv -b test/4/C/file1 test/4/C/file2 test/4/C/file3 test/4 ; rm -rvf test/4/C
mv -b test/5/B/file1 test/5/B/file2 test/5/B/file3 test/5 ; rm -rvf test/5/B
mv -b test/5/C/file1 test/5/C/file2 test/5/C/file3 test/5 ; rm -rvf test/5/C

如果输出看起来正常,那么您只需 | sh在该命令末尾附加,然后它将运行输出中显示的命令。

答案2

以下命令可以完成该工作:

cd /path/to/A
find -mindepth 3 -type f -execdir mv {} .. \;
find -mindepth 2 -type d -exec rm -d {} \;

另请参阅和操作man find之间的区别。-exec-execdir

答案3

鉴于你的目录结构,你不需要find这个 - shell 就足够了:

# the trailing slash below restricts results to directories
for dir in /path/to/A/*/; do
    mv "$dir"/[BC]/* $dir && rmdir "$dir"/[BC]
done

答案4

for以下脚本中的第二组循环应该可以完成您想要的操作。它们被标记为...

# move files from subdirs to the parent directory

第一组创建您描述的那种文件结构,并且有一些文件列表(ls)来显示正在发生的事情。

从内部运行脚本一个空目录验证它是否能满足您的要求。然后删除第二组 for 循环并进行修改以使用您需要的任何目录和文件名模式。

第二组中唯一不寻常的是内for循环被括在括号内( ... )。这是一种方便的“bashism”,它在子 shell 中运行其中的内容,因此cd只影响内for循环。如果您不想使用它们,请删除它们并cd ..在内for循环后面添加一个。

#!/bin/bash

echo "
Current dir= $(pwd)
"

# populate directories
for d1 in 1 2 3
do
  for d2 in B C
  do
    mkdir -p $d1/$d2
    for f in 1 2
    do
      touch $d1/$d2/file$d2$f   # include $d2 in filename so unique when merged
    done
  done
done

echo "
ORIGINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

# move files from subdirs to the parent directory
for d1 in 1 2 3
do (                    # run in subshell so 'cd' does not change outer loop dir
  cd $d1                #   cd into dir so mv is simpler
  for d2 in B C
  do
    mv $d2/* .          #     Move files in B and C up to parent dir
    #                   #     NOTE: Files in B with same name as
    #                   #           files in C will be silently overwritten!
    rmdir $d2           #     Remove the now empty B and C dirs (OPTIONAL)
  done
)
done

echo "

FINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

echo "
Current dir= $(pwd)
"

相关内容