একটি পাঠ্য ফাইলে তালিকাভুক্ত ফাইলগুলি কীভাবে মুছবেন


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
কোস

এটির ফোল্ডারগুলির বিভাজনকারী নামগুলি উপরে এবং তারপরে তাদের সন্ধান করা। যেমন আমার ফোল্ডারটি "আমার" এবং "ফোল্ডার" হিসাবে ব্যাখ্যা করা হচ্ছে?
ডাকা

@ সুডোমান উত্তর আপডেট হয়েছে।
এরিক কারভালহো

যদি ফাইলগুলির ফাঁকা স্থান না থাকে তবে আপনি কেবল "rm - $ (বিড়াল ফাইল)" বাশে বা "আরএম - cat file" ইন (বা) শ বা সিএসএসে রাখতে পারেন।
জুতা

@ শুপার অব্যবহারযোগ্য cat, যেমনটি বলা হয়েছে, এর থেকে সুবিধা নিন stdin! তার আপডেট হওয়া উত্তরটি দেখুন
কোস

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

এটি প্রথমে প্রতিটি ফাইলের নাম হ্যাশটিতে পড়ে এবং সেগুলির প্রত্যেকটি মুছতে %kব্যবহার unlinkকরবে delete


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
    

হ্যাঁ, এটি সম্পন্ন করার জন্য অনেকগুলি উপায় রয়েছে তবে এটি একটি খুব সহজ পদ্ধতি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.