我正在寻找用于将文件从子目录移动到父目录的脚本
我的文件夹结构如下。
- 文件夹 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)
"