【问题标题】:Bash command to remove several nested directoriesBash 命令删除多个嵌套目录
【发布时间】:2021-04-01 13:48:06
【问题描述】:

我犯了一个错误并创建了嵌套目录,例如:

dir1/dir2_A/out/dir2_A
    file1
    file2 
    out

dir1/dir2_B/out/dir2_B
    file1
    file2 
    out

dir1/dir2_C/out/dir2_C
    file1
    file2 
    out

...

如何删除所有中间目录:

dir1/dir2_A/out/dir2_A/ → dir1/dir2_A/
dir1/dir2_B/out/dir2_B/ → dir1/dir2_B/
dir1/dir2_C/out/dir2_C/ → dir1/dir2_C/

等等,在dir1得到这个?

dir1/dir2_A
    file1
    file2 
    out

dir1/dir2_B
    file1
    file2 
    out

dir1/dir2_C
    file1
    file2 
    out

【问题讨论】:

  • 你想要的是rm -rf dir1/dir2_*/out吗?
  • 此举将删除目录内的文件
  • 您的意思是“移动文件,使它们不在out 子目录中,而是在包含out 子目录的目录中”?使用“删除”会发送错误消息。
  • 你说得对,我可以将目录移动到dir1
  • 如果你有基于 Perl 的rename(偶尔prename)脚本/程序,你可以使用rename 's%/out/%/%' dir1/*/out/* 命令来移动文件。如果做不到这一点,您将进入循环文件:for file in dir1/*/out/*; do newdir=$(dirname $(dirname "$file")); mv "$file" "$newdir"; done。你可以想出一些关于该主题的变体,这些变体会减少 mv 的运行频率。

标签: linux bash shell directory


【解决方案1】:

下降到文件,将所有内容向上移动。
接下来删除空目录。 对子shell 使用括号,这样您就可以在没有cd ../.. 的情况下从d1 返回。

for d1 in dir1/*/*/*; do
    test -d "$d1" || continue
    (cd "$d1" && mv * ../.. )
done
# Cleanup without `rm -r` avoiding errors when something went wrong
rmdir dir1/*/out/* 
rmdir dir1/*/out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2014-03-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多