如何从bash中的文件名扩展机制中排除一些文件?

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的目录中自动mvrm,但说实话,因为我们正在处理的事情清洗文件系统的根目录,我强烈建议您考虑在可行的情况下手动执行此操作。

如果这是不可行的,这样的事情可以解决问题:

#!/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] /.