ルートディレクトリにubuntuファイルシステムディレクトリがあり、誤って何百ものファイルをルートディレクトリにコピーしました。
私は直感的に、次のようなファイルシステムを除外して、コピーしたファイルを削除しようとしました
rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.
動作しません。全体を削除しながら一部のディレクトリを除外する適切な方法は何ですか?
編集:何をすべきかわからないまま、ここでコマンドを実行しないでください!
bash
を使用しているため:
shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)
システム全体を破壊する可能性のあるものを実行している場合は、コマンドラインの先頭にecho
を追加することをお勧めします。結果に満足している場合は削除してください。
注:上記のコマンドは隠しファイル(名前がドットで始まるファイル)を削除しません。それらも削除したい場合は、dotglob
オプションも有効にします。
shopt -s dotglob
このコマンドは、/
内のすべての非ディレクトリを表示します。
find / -maxdepth 1 -type f
絶対を作成したら、保持するファイルが存在しないことを確認してから、以下を使用できます。
find / -maxdepth 1 -type f -delete
より安全な方法は、保存したいものを削除しないように、別の場所に移動することです。
mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;
ファイルに加えて、ファイルシステムのルートに追加したdirectoriesもある場合、これcould自動化されたmv
またはrm
からLSBディレクトリを除外することで自動化できますが、正直に言えば、ファイルシステムの場合、可能であれば手動で行うことを強くお勧めします。
これが不可能な場合は、次のような方法で解決できます。
#!/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] /
の順列の実行については考えないでください。これで仕事が完了するはずです(ただし、OPが要求する方法とは異なります)。
ls -1 >1.txt
pico 1.txt
保持したいすべてのファイル/ディレクトリを削除する
xargs rm < 1.txt
すべてのファイルの名前形式、日付などが同じである場合は、他の方法があります。
私はiノードを見て、それらがls -i | sortによってシーケンシャルであるかどうかを確認します。シーケンシャルである場合は、新しいファイルのiノードが大きくなります。次に、上記と同じタイプのプロセスを使用します...
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コマンドで、最初にiノードリストをチェックして、それが正しい量であることを確認してください。