ken*_*enn 18 bash filenames wildcards rm bash-expansion
我在根目录中有 ubuntu 文件系统目录,我不小心将数百个文件复制到根目录中。
我直觉地试图通过排除文件系统来删除复制的文件
rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.
Run Code Online (Sandbox Code Playgroud)
但它不起作用。在删除整个目录时排除某些目录的正确方法是什么?
编辑:永远不要在不知道该怎么做的情况下尝试这里的任何命令!
jim*_*mij 22
由于您正在使用bash:
shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)
Run Code Online (Sandbox Code Playgroud)
echo当您运行可能会炸毁整个系统的东西时,我建议在命令行的开头添加。如果您对结果满意,请将其删除。
注意:上述命令不会删除隐藏文件(名称以点开头的文件)。如果您还想删除它们,请同时激活dotglob选项:
shopt -s dotglob
Run Code Online (Sandbox Code Playgroud)
Dop*_*oti 12
此命令将显示以下所有非目录/:
find / -maxdepth 1 -type f
Run Code Online (Sandbox Code Playgroud)
一旦你取得了绝对确保没有文件是那里,你想保留,您可以使用:
find / -maxdepth 1 -type f -delete
Run Code Online (Sandbox Code Playgroud)
更安全的是,将它们移到其他地方以确保您不会删除要保留的内容:
mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;
Run Code Online (Sandbox Code Playgroud)
如果,除了文件,你也有目录,您已经添加到文件系统的根,这可以排除从自动LSB的目录中自动mv或rm,但说实话,因为我们正在处理的事情清洗文件系统的根目录,我强烈建议您考虑在可行的情况下手动执行此操作。
如果这是不可行的,这样的事情可以解决问题:
#!/bin/bash
declare -a excludes
for item in root sys 'lost+found' mnt home proc etc opt boot lib lib64 libx32 sbin media srv dev var usr bin tmp run; do
excludes+=("$item")
done
if ! [[ -d /root/preserve ]]; then
mkdir -p /root/preserve
fi
IFS="\n"
for item in find / -type d -maxdepth 1; do
really=true
for exclude in ${excludes[@]}; do
if [[ "$exclude" == "${item#/}" ]]; then
really=false
fi
done
if [[ "true" == "$really" ]]; then
mv -- "$item" /root/preserve/
fi
done
Run Code Online (Sandbox Code Playgroud)
一旦您通过了尖叫测试(即您的系统仍在运行并且您没有在痛苦中尖叫),您可以删除/root/preserve/.
rm -fr [ANYTHING GOES HERE] /.