텍스트 파일에 나열된 파일을 삭제하는 방법


23

다양한 파일의 경로 목록이있는 텍스트 파일이 있습니다. 각 줄을 반복하고 지정된 경로에서 파일을 삭제하는 명령을 사용할 수 있습니까?

답변:


33

사용 xargs:

xargs rm < file  # or
xargs -a file rm

그러나 파일 이름 / 경로에 이스케이프 해야하는 문자가 포함되어 있으면 작동하지 않습니다.

파일 이름에 줄 바꿈이 없으면 다음을 수행하십시오.

tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}

또는 다음 스크립트를 작성할 수 있습니다.

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "Usage: $(basename $0) FILE\n"
    exit 1
fi

if [ ! -e "$1" ]; then
    echo -e "$1: File doesn't exist.\n"
    exit 1
fi

while read -r line; do
    [ -n "$line" ] && rm -- "$line"
done < "$1"

로 저장하고 /usr/local/bin/delete-from실행 권한을 부여하십시오.

sudo chmod +x /usr/local/bin/delete-from

그런 다음 다음을 실행하십시오.

delete-from /path/to/file/with/list/of/files

2
정말 깨끗한 답변이지만 cat필수는 아닙니다 stdin. 리디렉션 을 사용할 수 있습니다 .< file xargs rm
kos

폴더 이름을 분할 한 다음 찾아 봅니다. 예 : MY FOLDER가 "MY"및 "FOLDER"로 해석됩니까?
daka

@sudoman 답변이 업데이트되었습니다.
Eric Carvalho

파일에 공백이 없으면 bash의 "rm-$ (cat file)"또는 cat file(ba) sh 또는 csh의 "rm- "만 가능합니다.
쇼퍼

@ shooper cat는 방금 언급했듯이 유용하지 않습니다 stdin! 그의 업데이트 된 답변을보십시오
kos

20

공백, 백 슬래시 및 기타 이상한 문자가있는 파일 이름을 처리 할 수있는 한 가지 방법이 있습니다.

while read -r file; do rm -- "$file"; done < list.txt

그러면의 각 줄을 읽고 다른 list.txt이름으로 저장 $file하고 실행 rm합니다. -r(그 때문에 백 슬래시 문자 그대로 읽어되도록 \t일치 \하고 t아닌 탭). 로 --시작하는 파일 이름도 처리합니다 -.

Perl에서도이를 수행 할 수 있습니다.

perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt

이것은 각 파일 이름을 %k해시 로 읽은 다음이를 사용 unlink하여 각 파일 이름 을 삭제합니다.


10

파이썬을 통해.

import sys
import os
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        os.remove(line.rstrip('\n'))

위의 스크립트를 like라는 파일에 저장 한 script.py다음 터미널에서 아래 명령을 실행하여 스크립트를 실행하십시오.

python3 script.py file

file 실제로 제거하려는 파일의 경로가 저장되는 입력 파일입니다.


6
아, 적어도 당신은 파이썬 답변을 게시 할 용기가 있습니다 :)
Jacob Vlijm

3

바보, 그러나 여기에 하나가있다 :

 tar -cvf /dev/null --remove-files -T filename

2

이를 수행하는 다른 방법 :

쉘 스크립트를 만들어 파일을 '준비'할 수 있습니다.

$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'

파일 이름에 작은 따옴표 ( ') 가있는 경우이 약간 확장 된 버전을 사용하여 먼저 이스케이프 할 수 있습니다.

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''

그리고 이것을 파이프로 연결하여 실행할 수 있습니다 sh.

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh

1

내가 이해하는 것처럼 전체 경로가있는 파일이있는 텍스트 파일이 있습니다. 두 가지 가능성이 있습니다.

  1. 목록에는 줄 바꿈으로 구분 된 파일 이름이 있습니다. 즉, 각 줄에는 파일의 전체 경로가 있습니다. 이 경우 간단한 방법은 다음과 같습니다.

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. 목록에 공백 또는 탭으로 구분 된 하나 이상의 파일 이름 행이있는 경우 다음은 드릴입니다.

    sed -i 's/\s\+/\n/g' listOfFiles.txt
    

    이것은 모든 공백을 개행으로 변환합니다

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    

예, 많은 방법이 있지만 매우 간단한 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.