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
명령을 실행하면 다음과 같은 재귀 동작이 수행됩니다.
이 특별한 경우에는 다른 답변에 언급 된 위험성으로 인해
예를 들어 Vim 및에서 편집
:%s/\s/\\\0/g
하여 백 슬래시로 모든 공백 문자를 이스케이프하십시오.그런 다음
:%s/^/rm -rf /
명령 앞에옵니다. 함께-r
사용하면 파일이 안에 포함 된 다음에 다음 디렉토리를 가지고 걱정할 필요가 없습니다, 그리고 함께-f
그것으로 인해 누락 된 파일 또는 파일이 포함되어 있습니다.모든 명령을 실행하십시오.
$ 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
'ProgramingTip' 카테고리의 다른 글
MongoDb가 코드 100으로 종료 됨 (0) | 2020.10.20 |
---|---|
자바에서 경도와 위도를 알고있을 때 미터 단위로 거리 계산 (0) | 2020.10.20 |
Html.TextBoxFor에 대한 조건에 따라 속성 설정 (0) | 2020.10.20 |
JS 객체에 키가 있는지 확인 (0) | 2020.10.20 |
Android Studio의 JNI 및 Gradle (0) | 2020.10.20 |