ฉันมีไฟล์ข้อความที่มีรายการเส้นทางไปยังไฟล์ต่างๆ มีคำสั่งที่ฉันสามารถใช้เพื่อวนซ้ำแต่ละบรรทัดและลบไฟล์ที่เส้นทางที่ระบุหรือไม่
ฉันมีไฟล์ข้อความที่มีรายการเส้นทางไปยังไฟล์ต่างๆ มีคำสั่งที่ฉันสามารถใช้เพื่อวนซ้ำแต่ละบรรทัดและลบไฟล์ที่เส้นทางที่ระบุหรือไม่
คำตอบ:
ใช้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