web-dev-qa-db-ja.com

bashのファイル名拡張メカニズムから一部のファイルを除外するにはどうすればよいですか?

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

私は直感的に、次のようなファイルシステムを除外して、コピーしたファイルを削除しようとしました

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

動作しません。全体を削除しながら一部のディレクトリを除外する適切な方法は何ですか?

編集:何をすべきかわからないまま、ここでコマンドを実行しないでください!

14
kenn

bashを使用しているため:

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

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

注:上記のコマンドは隠しファイル(名前がドットで始まるファイル)を削除しません。それらも削除したい場合は、dotglobオプションも有効にします。

shopt -s dotglob
21
jimmij

このコマンドは、/内のすべての非ディレクトリを表示します。

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] /の順列の実行については考えないでください。

12
DopeGhoti

これで仕事が完了するはずです(ただし、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ノードリストをチェックして、それが正しい量であることを確認してください。

3
MikeP