루트 디렉터리에 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 목록을 확인하여 번호가 올바른지 확인하세요.