ルートディレクトリに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のリストを調べて、番号が正しいことを確認してください。