삭제할 파일 마스크 목록이 포함 된 긴 텍스트 파일이 있습니다.
예:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
삭제해야합니다. rm`cat 1.txt`를 시도했는데 목록이 너무 깁니다.
이 명령을 찾았지만 목록에서 폴더를 확인할 때 일부 폴더에는 여전히 파일이 있습니다.
xargs rm <1.txt
수동 rm 호출은 이러한 폴더에서 파일을 제거하므로 권한에 문제가 없습니다.
삭제할 파일 마스크 목록이 포함 된 긴 텍스트 파일이 있습니다.
예:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
삭제해야합니다. rm`cat 1.txt`를 시도했는데 목록이 너무 깁니다.
이 명령을 찾았지만 목록에서 폴더를 확인할 때 일부 폴더에는 여전히 파일이 있습니다.
xargs rm <1.txt
수동 rm 호출은 이러한 폴더에서 파일을 제거하므로 권한에 문제가 없습니다.
답변:
파일 목록이 파일에 있다고 가정하고 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 패턴이 더 이상 필요하지 않은 방식으로 삭제 목록을 준비한 다음 첫 번째 예제와 같이 인용 을 사용하는 것이 좋습니다 .
/My Dir With Spaces/
/Spaces and globs/*.txt
, 를 처리하는 유일한 답변이며 , --file-with-leading-dashes
보너스로 POSIX이며 GNU / Linux, macOS 및 BSD에서 작동합니다.
개행 문자를 구분 기호로 정의하기 위해 '\ n'을 사용할 수 있습니다.
xargs -d '\n' rm < 1.txt
1.txt에 공백이있는 경로가 포함 된 경우 원하지 않는 항목을 삭제할 수 있으므로 -rf에주의하십시오. 그래서 새 줄 구분 기호가 더 안전합니다.
BSD 시스템에서는 -0 옵션을 사용하여 다음과 같은 구분 기호로 줄 바꾸기 문자를 사용할 수 있습니다.
xargs -0 rm < 1.txt
xargs: illegal option -- d
-0
OS X 외에 다른 옵션이없는 것 같습니다.
xargs -I_ rm _
OS X에서도 작동합니다. :) stackoverflow.com/a/39335402/266309
-d
먼저 줄 바꿈을 null로 변환 할 수 있습니다.tr '\n' '\0' < 1.txt | xargs -0 rm
이 한 줄짜리를 사용할 수 있습니다.
cat 1.txt | xargs echo rm | sh
쉘 확장을 수행하지만 rm
최소 횟수를 실행 합니다.
-n <n>
인수를 추가하여 xargs
각 rm에 전달되는 인수 수를 줄일 수 있지만 여전히 제한을 초과하는 단일 glob으로부터 보호하지는 못합니다.
xargs -I{} sh -c 'rm {}' < 1.txt
당신이 원하는 것을해야합니다. 해당 파일에 잘못된 항목이 하나 있으면 많은 문제가 발생할 수 있으므로이 명령에주의하십시오.
이 답변은 @tdavies가 원본이 셸 확장을 수행하지 않았다고 지적한 후에 편집되었습니다.
xargs -I{} sh -c 'rm {}' < 1.txt
이 특별한 경우에는 다른 답변에 언급 된 위험성으로 인해
예를 들어 Vim 및에서 편집 :%s/\s/\\\0/g
하여 백 슬래시로 모든 공백 문자를 이스케이프하십시오.
그런 다음 :%s/^/rm -rf /
명령 앞에옵니다. 함께 -r
사용하면 파일이 안에 포함 된 다음에 나열 디렉토리를 가지고 걱정할 필요가 없습니다, 그리고 함께 -f
그것으로 인해 누락 된 파일 또는 중복 된 항목에 불평하지 않습니다.
모든 명령을 실행하십시오. $ source 1.txt
여기에서 폴더의 설정을 사용할 수 있습니다 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
누군가 와일드 카드 확장없이 선호 sed
하고 제거하는 경우 :
sed -e "s/^\(.*\)$/rm -f -- \'\1\'/" deletelist.txt | /bin/sh
알림 : 파일에서 절대 경로 이름을 사용하거나 올바른 디렉토리에 있는지 확인하십시오.
완전성을 위해 다음과 awk
같습니다.
awk '{printf "rm -f -- '\''%s'\''\n",$1}' deletelist.txt | /bin/sh
작은 따옴표를 제거하면 와일드 카드 확장이 작동하지만 파일 이름에 공백이 포함 된 경우 위험합니다. 와일드 카드 주위에 따옴표를 추가해야합니다.