วิธีลบไฟล์ที่อยู่ในไฟล์ข้อความ


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

หากไฟล์ไม่มีช่องว่างคุณสามารถ "rm - $ (ไฟล์ cat)" เป็น bash หรือ "rm - cat file" in (ba) sh หรือ csh
shooper

@ shooper catไม่ใช้ตามที่ระบุไว้ใช้ประโยชน์จากstdin! ดูที่คำตอบการอัปเดตของเขา
คอส

20

นี่เป็นวิธีหนึ่งที่สามารถจัดการกับชื่อไฟล์ด้วยช่องว่างแบ็กสแลชและอักขระแปลก ๆ ได้:

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

ที่จะอ่านแต่ละบรรทัดlist.txtบันทึกเป็น$fileและทำงานrmกับมัน -rเพื่อให้แน่ใจว่า backslashes จะอ่านตัวอักษร (เพื่อให้\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และจากนั้นเรียกใช้สคริปต์โดย firing คำสั่งด้านล่างบนเทอร์มินัล

python3 script.py file

file เป็นไฟล์อินพุตที่เก็บพา ธ ของไฟล์ที่คุณต้องการลบจริงๆ


6
อาอย่างน้อยคุณมีความกล้าที่จะแสดงความหลามคำตอบ :)
จาค็อบ Vlijm


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.