ฉันมีไฟล์ข้อความที่มีรายการเส้นทางไปยังไฟล์ต่างๆ มีคำสั่งที่ฉันสามารถใช้เพื่อวนซ้ำแต่ละบรรทัดและลบไฟล์ที่เส้นทางที่ระบุหรือไม่
ฉันมีไฟล์ข้อความที่มีรายการเส้นทางไปยังไฟล์ต่างๆ มีคำสั่งที่ฉันสามารถใช้เพื่อวนซ้ำแต่ละบรรทัดและลบไฟล์ที่เส้นทางที่ระบุหรือไม่
คำตอบ:
ใช้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
cat file" in (ba) sh หรือ csh
                    catไม่ใช้ตามที่ระบุไว้ใช้ประโยชน์จากstdin! ดูที่คำตอบการอัปเดตของเขา
                    นี่เป็นวิธีหนึ่งที่สามารถจัดการกับชื่อไฟล์ด้วยช่องว่างแบ็กสแลชและอักขระแปลก ๆ ได้:
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เพื่อลบแต่ละไฟล์
ผ่านหลาม
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 เป็นไฟล์อินพุตที่เก็บพา ธ ของไฟล์ที่คุณต้องการลบจริงๆ
Silly แต่นี่คือหนึ่ง:
 tar -cvf /dev/null --remove-files -T filename
อีกวิธีในการทำสิ่งนี้:
คุณสามารถ 'เตรียม' ไฟล์โดยทำให้เป็นเชลล์สคริปต์:
$ 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
ตามที่ฉันเข้าใจคุณมีไฟล์ข้อความพร้อมไฟล์ที่มีเส้นทางที่สมบูรณ์ มีความเป็นไปได้สองอย่าง:
รายการของคุณมีชื่อไฟล์คั่นด้วยการขึ้นบรรทัดใหม่นั่นคือแต่ละบรรทัดมีพา ธ ที่สมบูรณ์ไปยังไฟล์ ในกรณีนี้: นี่เป็นวิธีง่ายๆ:
for i in $(cat listOfFiles.txt); do
    rm -f $i
done
หากรายการของคุณมีชื่อไฟล์อย่างน้อยหนึ่งบรรทัดคั่นด้วยช่องว่างหรือแท็บนี่คือการฝึกซ้อม:
sed -i 's/\s\+/\n/g' listOfFiles.txt
สิ่งนี้จะแปลงพื้นที่ว่างทั้งหมดเป็นบรรทัดใหม่
for i in $(cat listOfFiles.txt); do
    rm -f $i
done
ใช่มีหลายวิธีที่จะทำให้เสร็จ แต่นี่เป็นวิธีที่ง่ายมาก
catไม่จำเป็นคุณสามารถใช้การstdinเปลี่ยนเส้นทางได้:< file xargs rm