我有一棵目录树,我需要删除其中一些目录并将所有文件从这些目录向上移动一级。
我知道如何一步步去做,但是有数千个,所以我需要优化流程。
我查找目录find . -type d -name 'src'
,然后需要将找到的目录中的所有文件向上移动一级 ( ../
)。
root
- one
-- two
--- src
- three
-- four
--- five
---- src
第一个内容src
应移至two
,第二个内容应src
移至five
我怎样才能用一个脚本做到这一点?
答案1
就像是:
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \;
请注意-i
标记为mv
。如果它要求您确认是否覆盖某些内容,您应该说“不”,除非您期望这样做。
既然您说您之后也想删除这些src
目录,请使用:
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \; -exec rmdir {} \;
先做好备份。
答案2
src
假设每个级别 都没有嵌套子目录,并且src
是最新的目录级别,那么下面应该完成这项工作。
find . -path '*/src/*' -type f -execdir echo mv -t ../ {} +
答案3
我知道的最安全的方法是:
cd
“你的目录在哪里”- 现在使用
tar
将它们保存在某处:tar -cvf
“要保存到的文件名,例如 /tmp/mysavfil.tar”“所有目录的名称,例如:foo bar 等”,这样您就得到:tar -cvf /tmp/mysavfil.tar foo bar
- 然后做:
cd ..
- 然后:
tar xvf /tmp/mysavfil.tar
- 或者,如果您希望删除不再需要的文件,如下所示:
cd
“文件所在的原始位置”;rm -rf foo bar
;rm /tmp/mysavefiltar
- 你完成了
一个更简单的方法是:
mv foo bar ../.