पाठ फ़ाइल में सूचीबद्ध फ़ाइलों को कैसे हटाएं


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
कोस

इसके फ़ोल्डरों के विभाजन के नाम और फिर उनकी तलाश। उदाहरण के लिए मेरे FOLDER को "MY" और "FOLDER" कहा जा रहा है?
डेका

@sudoman उत्तर अपडेट किया गया।
एरिक कारवाल्हो

यदि फ़ाइलों में स्थान नहीं है, तो आप बस "rm - $ (कैट फ़ाइल)" को bash या "rm - cat file" इन ​​(ba) श या csh में ले सकते हैं।
शॉपर

@ शॉपर अप्रयुक्त catहै, जैसा कि अभी कहा गया है, इसका लाभ उठाएं stdin! उनके अद्यतन उत्तर को देखें
kos

20

यहाँ एक तरीका है जो व्हॉट्सएप, बैकस्लैश और अन्य अजीब पात्रों के साथ फ़ाइल नामों से निपट सकता है:

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उनमें से प्रत्येक को हटाने के लिए उपयोग करता है।


10

अजगर के माध्यम से।

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 एक इनपुट फ़ाइल है जहाँ उन फ़ाइलों का पथ है जिन्हें आप वास्तव में निकालना चाहते हैं।


6
आह, कम से कम आप में एक अजगर जवाब पोस्ट करने की हिम्मत है :)
याकूब व्लिजम

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
    

हां, इसे पूरा करने के कई तरीके हैं, लेकिन यह बहुत ही सरल तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.