উত্তর:
ব্যবহার 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
" ইন (বা) শ বা সিএসএসে রাখতে পারেন।
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
এটি প্রথমে প্রতিটি ফাইলের নাম হ্যাশটিতে পড়ে এবং সেগুলির প্রত্যেকটি মুছতে %k
ব্যবহার unlink
করবে delete
অজগর মাধ্যমে।
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