ProgramingTip

Unix : 파일에 파일을 삭제하는 방법

bestdevel 2020. 10. 20. 07:56
반응형

Unix : 파일에 파일을 삭제하는 방법


포함 된 긴 텍스트 파일이 있습니다.

예 :

/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php

삭제해야합니다. rm`cat 1.txt`를 시도한 적이 있습니다.

이 명령을 찾았지만 목록에서 폴더를 확인할 때 일부 폴더에는 여전히 파일이 있습니다. xargs rm <1.txt수동 rm 호출은 설치 폴더에서 파일을 제거 권한에 문제가 없습니다.


이것은 매우 중요하지만 glob 패턴이 필요한 경우 작동합니다 (/ var / www / *에서와 같이).

for f in $(cat 1.txt) ; do 
  rm "$f"
done

패턴이없고 파일의 경로에 공백이나 기타 이상한 요소가 포함되어 있지 않다고 확신하는 경우 다음과 같이 xargs를 사용할 수 있습니다.

xargs rm < 1.txt

가정 목록이 파일에 파일 을 수행 하고 1.txt다음을 수행하십시오.

xargs rm -r <1.txt

-r옵션은에 이름이 지정된 모든 디렉토리로 재귀를 발생 개선 1.txt합니다.

파일이 읽기 전용 인 경우 -f옵션을 사용하여 강제로 삭제합니다.

xargs rm -rf <1.txt

프로그래밍 방식으로 삭제 하는 도구 대한 입력에주의하세요 . 확인 특정 입력 파일에 명명 된 파일이 정말 삭제합니다. 특히 단순하게 보이는 오타에주의하십시오. 예를 들어 파일과 접미사 사이에 공백을 입력하면 두 개의 고유 한 파일 이름으로 나타납니다.

file .txt

실제로 두 개의 별도의 파일입니다 : file.txt.

이것은 그렇게 위험 해 보이지 않을 경우 오타가 다음과 같은 경우 :

myoldfiles *

대신로 시작하는 모든 파일을 삭제하는 다음 다음 myoldfiles, 당신은 삭제 될 것 myoldfiles모든 현재 디렉토리가 아닌 점 파일 및 디렉토리. 아마도 당신이 원하는 것이 아닐 것입니다.


이것을 사용하십시오 :

while IFS= read -r file ; do rm -- "$file" ; done < delete.list

glob 확장이 필요한 경우 인용을 생략 할 수 있습니다 $file.

IFS=""
while read -r file ; do rm -- $file ; done < delete.list

그러나 "문제가있는"내용이없는 이름 버전을 사용합니다. 파일 에서이 패턴을 상상해.

*
*/*
*/*/*

현재 디렉토리에서 상당히 많이 삭제됩니다! glob 패턴이 더 이상 필요하지 않은 방식으로 삭제 목록을 준비한 다음 첫 번째 예제와 같이 인용문사용하는 것이 좋습니다.


개행 문자를 구분 기호로 정의하기 위해 '\ n'을 사용할 수 있습니다.

xargs -d '\n' rm < 1.txt

1.txt에 공백이있는 경로가 포함 된 경우에는없는 항목을 사용하십시오. 그래서 새 줄 구분 기호가 더 안전합니다.

BSD 시스템에서는 -0 옵션을 사용하여 다음과 같은 구분 기호로 줄 문자를 사용할 수 있습니다.

xargs -0 rm < 1.txt

xargs -I{} sh -c 'rm {}' < 1.txt당신이 원하는 것을해야합니다. 이 파일에 잘못된 항목이 하나 있으면 많은 문제가 있습니다.

이 답변은 @tdavies가 셸 확장을 수행하지 않았다고 지적한 후에 편집했습니다.


이 한 줄짜리를 사용할 수 있습니다.

cat 1.txt | xargs echo rm | sh

확장을 수행 쉘하지만 rm최소 횟수를 실행 합니다.


cat 1.txt | xargs rm -f | bash 명령을 실행하면 파일에 다음이 수행됩니다.

cat 1.txt | xargs rm -rf | bash 명령을 실행하면 다음과 같은 재귀 동작이 수행됩니다.


이 특별한 경우에는 다른 답변에 언급 된 위험성으로 인해

  1. 예를 들어 Vim 및에서 편집 :%s/\s/\\\0/g하여 백 슬래시로 모든 공백 문자를 이스케이프하십시오.

  2. 그런 다음 :%s/^/rm -rf /명령 앞에옵니다. 함께 -r사용하면 파일이 안에 포함 된 다음에 다음 디렉토리를 가지고 걱정할 필요가 없습니다, 그리고 함께 -f그것으로 인해 누락 된 파일 또는 파일이 포함되어 있습니다.

  3. 모든 명령을 실행하십시오. $ source 1.txt


다음은 또 다른 반복 예제입니다. 여기에는 항목이 '파일'(예 : '디렉토리')인지 확인하는 예로서 'if- 문'이 포함되어 있습니다.

for f in $(cat 1.txt); do if [ -f $f ]; then rm $f; fi; done

여기에서 폴더의 설정을 사용할 수 있습니다 deletelist.txt 동안 몇 가지 패턴을 피할 뿐만 아니라

foreach f (cat deletelist.txt)
    rm -rf ls | egrep -v "needthisfile|*.cpp|*.h"
end

이렇게하면 파일 이름에 공백이있을 수 있습니다 (재현 가능한 예).

# Select files of interest, here, only text files for ex.
find -type f -exec file {} \; > findresult.txt
grep ": ASCII text$" findresult.txt > textfiles.txt
# leave only the path to the file removing suffix and prefix
sed -i -e 's/:.*$//' textfiles.txt
sed -i -e 's/\.\///' textfiles.txt

#write a script that deletes the files in textfiles.txt
IFS_backup=$IFS
IFS=$(echo "\n\b")
for f in $(cat textfiles.txt); 
do 
rm "$f"; 
done
IFS=$IFS_backup

# save script as "some.sh" and run: sh some.sh

다른 방법을 제공하기 위해 다음 명령을 사용할 수도 있습니다.

$ cat to_remove
/tmp/file1
/tmp/file2
/tmp/file3
$ rm $( cat to_remove )

참고 URL : https://stackoverflow.com/questions/5142429/unix-how-to-delete-files-listed-in-a-file

반응형