Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash命令删除多个嵌套目录_Linux_Bash_Shell_Directory - Fatal编程技术网

Linux Bash命令删除多个嵌套目录

Linux Bash命令删除多个嵌套目录,linux,bash,shell,directory,Linux,Bash,Shell,Directory,我犯了一个错误,创建了嵌套目录,例如: 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

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

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

下降到文件,将所有内容向上移动。
接下来,删除空目录。 在子shell中使用括号,以便从d1返回,而不使用
cd../.

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

下降到文件,将所有内容向上移动。
接下来,删除空目录。 在子shell中使用括号,以便从d1返回,而不使用
cd../.

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

rm-rf dir1/dir2.*/out
是您想要的吗?此移动将删除目录中的文件。您的意思是“移动文件,使其不在
out
子目录中,而是在包含
out
子目录的目录中”?使用“remove”发送错误的消息。您是对的,我可以将目录移动到
dir1
中。如果您有基于Perl的
rename
(偶尔
prename
)脚本/程序,您可以使用
rename's%/out/%/dir1/*/out/*
命令移动文件。如果做不到这一点,您将在文件上循环:
for file in dir1/*/out/*;do newdir=$(dirname$(dirname“$文件”);mv“$file”“$newdir”;完成
。您可以在该主题上提出一些变体,以减少运行
mv
的次数。
rm-rf dir1/dir2.*/out
是您想要的吗?此移动将删除目录中的文件,您的意思是“移动文件,使其不在
out
子目录中,而是在包含
out
子目录的目录中”?使用“remove”发送错误消息。您是对的,如果您有基于Perl的
重命名
(偶尔
prename
),我可以将目录移动到
dir1
)脚本/程序,您可以使用重命名的%/out/%/%%dir1/*/out/*命令来移动文件。否则,您将在文件上循环:
for file in dir1/*/out/*;do newdir=$(dirname$(dirname“$file”);mv“$file”“$newdir"; 完成
。您可以针对该主题提出一些变体,以减少运行
mv
的频率。