Bashのファイル名拡張メカニズムから特定のファイルを除外する方法は?

Bashのファイル名拡張メカニズムから特定のファイルを除外する方法は?

ルートディレクトリにubuntuファイルシステムディレクトリがあり、誤って何百ものファイルをルートディレクトリにコピーしました。

ファイルシステムを除いて、コピーされたファイルを直感的に削除しようとしました。

rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.

しかし、うまくいきません。ディレクトリ全体を削除するときに特定のディレクトリを除外する正しい方法は何ですか?

編集する:何をすべきかわからず、ここにあるコマンドを試さないでください!

答え1

あなたが使用しているのでbash

shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)

echoシステム全体を台無しにする可能性があるものを実行している場合は、コマンドラインの先頭に追加することをお勧めします。結果が満足であれば削除してください。

注:上記のコマンドは、隠しファイル(名前がドットで始まるファイル)を削除しません。これらのアイテムも削除するには、次のdotglobオプションも有効にしてください。

shopt -s dotglob

答え2

このコマンドは、次の場所にディレクトリ以外のすべてのエントリを表示します/

find / -maxdepth 1 -type f

そうしたら完全にアーカイブするファイルがないことを確認し、次のものを使用できます。

find / -maxdepth 1 -type f -delete

より安全なアプローチは、アーカイブしたいアイテムが削除されないように他の場所に移動することです。

mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;

ファイル以外に持っている場合目次ファイルシステムのルートに以下を追加しました。できるmv自動からLSBディレクトリを除外すると、自動化が可能です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

悲鳴テストに合格した場合(つまり、システムがまだ実行されていて痛みを伴って音を鳴らさない場合)、コンテンツを削除できます/root/preserve/

重要:何をしても走ることについて考えないでくださいrm -fr [ANYTHING GOES HERE] /

答え3

これはこれを行う必要があります(OPが要求したのと同じ方法ではありませんが)。

ls -1 >1.txt
pico 1.txt 

アーカイブするすべてのファイル/ディレクトリを削除します。

xargs rm < 1.txt

ファイルの名前形式、日付、またはその他のコンテンツがすべて同じ場合は、他の方法があります。

インデックスノードを見て、連続していることを確認します。ls -i |その場合、新しいファイルのinodeが大きくなります。次に、上記と同じタイプのプロセスを使用します。

ls -iF1 | sort |cut -c10- | grep -vE "\/|\@" >i.txt   #This part removes entries that are not regular files, such as directories and links.  
pico i.txt
xargs rm < i.txt

上記のcutコマンドでまずinodeのリストを調べて、番号が正しいことを確認してください。

関連情報