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 목록을 확인하여 번호가 올바른지 확인하세요.

관련 정보