जवाबों:
उपयोग करें 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
" इन (ba) श या csh में ले सकते हैं।
cat
है, जैसा कि अभी कहा गया है, इसका लाभ उठाएं stdin
! उनके अद्यतन उत्तर को देखें
यहाँ एक तरीका है जो व्हॉट्सएप, बैकस्लैश और अन्य अजीब पात्रों के साथ फ़ाइल नामों से निपट सकता है:
while read -r file; do rm -- "$file"; done < list.txt
वह प्रत्येक पंक्ति पढ़ेगा list.txt
, उसे सहेजेगा $file
और rm
उस पर चलाएगा । यह -r
सुनिश्चित करता है कि बैकस्लैश शाब्दिक रूप से पढ़े जाते हैं (ताकि एक और एक टीएबी से \t
मेल खाता हो )। यह सुनिश्चित करता है कि यह शुरू होने वाले फ़ाइल नामों से भी संबंधित है ।\
t
--
-
आप पर्ल में भी ऐसा कर सकते हैं:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
यह एक wil %k
हैश में प्रत्येक फ़ाइल का नाम पढ़ता है और फिर unlink
उनमें से प्रत्येक को हटाने के लिए उपयोग करता है।
अजगर के माध्यम से।
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
उपरोक्त स्क्रिप्ट को नाम की फ़ाइल में सहेजें script.py
और फिर टर्मिनल पर नीचे कमांड को फायर करके स्क्रिप्ट निष्पादित करें।
python3 script.py file
file
एक इनपुट फ़ाइल है जहाँ उन फ़ाइलों का पथ है जिन्हें आप वास्तव में निकालना चाहते हैं।
ऐसा करने का एक और तरीका:
आप फ़ाइल को शेल स्क्रिप्ट बनाकर 'तैयार' कर सकते हैं:
$ 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