যে $(cat file_list.txt)মত POSIX শাঁস মধ্যে bashতালিকা প্রেক্ষাপটে বিভক্ত + + উল্লিখিত glob অপারেটর আছে ( zshশুধু বিভক্ত অংশ হিসেবে আপনি আশা করতে চাই)।
এটি $IFS(ডিফল্টরূপে, এসপিসি , টিএবি এবং এনএল) চরিত্রগুলিতে বিভক্ত হয় এবং আপনি গ্লোব্বিং পুরোপুরি বন্ধ না করে গ্লোব করে does
এখানে, আপনি কেবল নিউলাইনে বিভক্ত করতে চান এবং গ্লোব অংশটি চান না, তাই এটি হওয়া উচিত:
IFS='
' # split on newline only
set -o noglob # disable globbing
for file in $(cat file_list.txt); do # split+glob
mv -- "$file" "new_place/$file"
done
while readখালি লাইনগুলি বাতিল করতে, একটি অনুসরণযোগ্য নিরবচ্ছিন্ন লাইন সংরক্ষণ এবং স্টিডিন সংরক্ষণের mv(উদাহরণস্বরূপ অনুরোধের ক্ষেত্রে প্রয়োজনীয়) সংরক্ষণ করার সুবিধাও রয়েছে (একটি লুপের উপরে )।
ফাইলটির সম্পূর্ণ সামগ্রীটি মেমরিতে সংরক্ষণ করতে হবে (বেশ কয়েকবার শেল bashএবং লাইক সহ zsh) বেশিরভাগ ক্ষেত্রেই এর অসুবিধা রয়েছে ।
কিছু শাঁস (সঙ্গে ksh, zshএবং একটি ক্ষুদ্রতর ব্যাপ্তি bash), আপনার সাথে নিখুত করতে $(<file_list.txt)পরিবর্তে $(cat file_list.txt)।
একটি while readলুপ দিয়ে সমতুল্য করতে, আপনার প্রয়োজন হবে:
while IFS= read <&3 -r file || [ -n "$file" ]; do
{
[ -n "$file" ] || mv -- "$file" "new_place/$file"
} 3<&-
done 3< file_list.txt
বা সাথে bash:
readarray -t files < file_list.txt &&
for file in "${files[@]}"
[ -n "$file" ] || mv -- "$file" "new_place/$file"
done
বা সাথে zsh:
for file in ${(f)"$(<file_list.txt)"}
mv -- "$file" "new_place/$file"
done
বা জিএনইউ সহ mvএবং zsh:
mv -t -- new_place ${(f)"$(<file_list.txt)"}
বা GNU mvএবং GNU xargsএবং ksh / zsh / bash সহ:
xargs -rd '\n' -a <(grep . file_list.txt) mv -t -- new_place
বাশ / পসিক্স শেলগুলির একটি পরিবর্তনশীল উদ্ধৃতি ভুলে যাওয়ার সুরক্ষা সম্পর্কিত প্রভাবগুলিতে অনর্থক বিস্তৃতি ছাড়ার অর্থ কী সম্পর্কে আরও পড়ুন