ডিরেক্টরি নয় এমন প্রতিটি ফাইল সরান


14

আমার একটি ডিরেক্টরি রয়েছে যা আমি পরিষ্কার করার চেষ্টা করছি যা ফাইল এবং উপ ডিরেক্টরি প্রত্যেকে অন্তর্ভুক্ত করে। আমি যা করার চেষ্টা করছি তা সহজ: সমস্ত ফাইল অন্য ডিরেক্টরিতে সরিয়ে ফেলুন, তবে সমস্ত উপ-ডিরেক্টরি যেমন রয়েছে তেমন ছেড়ে দিন।

আমি এমন কিছু ভাবছি:

mv [*_but_no_dirs] ./other_directory

দেখে মনে হচ্ছে ওয়াইল্ডকার্ড *এবং রেজেক্স দিয়ে এটি করার একটি সহজ উপায় থাকা উচিত ...

কারও ধারণা আছে?


1
সুতরাং একটি সাবফোল্ডারে সমস্ত ফাইল সরান, কিন্তু সাব ডিরেক্টরিতে কোনও উপেক্ষা?
উইলফ

@ উইলফ: হুবহু
প্রশ্নোত্তর

2
Zsh এ, আপনি করতে পারেন mv **/*(.) ./other_directory- ব্যাশের সাহায্যে আপনাকে যেমন বাহ্যিক কমান্ডগুলির আশ্রয় নেওয়া দরকার find
গডলিজিক

উত্তর:


12

রেজেক্স এখানে জড়িত নেই। ব্যাশের ওয়াইল্ডকার্ডস (অন্যান্য শাঁসের মতো) কেবল ফাইলের নামের উপর ভিত্তি করে ফাইলগুলি মেলে, ফাইলের ধরণ বা অন্যান্য বৈশিষ্ট্যের ভিত্তিতে নয়। প্রকার অনুসারে মেলানোর একটি উপায় রয়েছে: /প্যাটার্নের শেষে যুক্ত করা এটি কেবল ডিরেক্টরি বা ডিরেক্টরিতে প্রতীকী লিঙ্কগুলির সাথে মেলে। এইভাবে, আপনি ডিরেক্টরিগুলি সরাতে পারেন, তারপরে যা বাকী রয়েছে সেগুলি সরিয়ে নিয়ে যেতে পারেন এবং ডিরেক্টরিগুলি পিছনে স্থানান্তর করতে পারেন - জটিল তবে এটি কাজ করে works

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

একটি আদর্শ উপায় টাইপ করে ফাইল মেলে কল হয় find

find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

Zsh এ, আপনি টাইপ অনুসারে ফাইলগুলি ম্যাচ করতে গ্লোব কোয়ালিফায়ার ব্যবহার করতে পারেন । .কোয়ালিফায়ার নিয়মিত ফাইল মিলবে ^/সমস্ত অ-ডিরেক্টরি মেলাতে ব্যবহার করতে বা ডিরেক্টরিতে -^/প্রতীকী লিঙ্কগুলি অন্তর্ভুক্ত করতে ব্যবহার করুন।

mv -- *(.) other_directory/

যে কোনও শেলের মধ্যে আপনি কেবল লুপ করতে পারেন।

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done

8

আপনি যেমন কিছু ব্যবহার করতে পারে

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

প্রথমে আমরা findকেবল বর্তমান ডিরেক্টয়য়ের মধ্যে দেখতে ব্যবহার করি, তারপরে আমরা ডিরেক্টরিগুলি উপেক্ষা করে ! -type d অবশেষে আমরা নির্বাহ করি shএবং গন্তব্যস্থল ডীরে নিয়ে যাই। আপনি {} +শেষে চেষ্টা করতে পারেন যা দ্রুত হবে।


2
একটু ব্যাখ্যায়, দয়া করে ...
প্রশ্নোত্তর

1
@ প্রশ্নেশনমার্ক আমি উত্তর আপডেট করেছি এবং কিছু ব্যাখ্যা যোগ করেছি did এছাড়াও, এটি mywiki.wooledge.org/UsingFind
ভ্যালেন্টাইন বাজরামি

এর -exec sh -c 'mv "$@" MYDIR' _ {} \;চেয়ে পরামর্শ দিচ্ছেন কেন -exec mv {} MYDIR \;? শুধু কিছু যে পরিবর্তন করে মসৃণ করা যাবে পেতে \;একটি থেকে +? আপনি -exec mv -t MYDIR {} +ফর্মটি দিয়ে এটি করতে পারেন ।
স্কট 19

@ স্কট আমি -tপতাকা সম্পর্কে কোন ধারণা ছিল না । আমি উত্তরে আরও জানিয়েছি যে এটি +দ্রুত তবে সমস্ত findসংস্করণ এটি সমর্থন করে না। সুতরাং উপরের কোডটি findব্যবহার করা যে কোনও বা শেলের সাথে বেশ সামঞ্জস্যপূর্ণ ।
ভ্যালেন্টিন বজরামি

1
@ val0x00ff: "... উপরের কোডটি findব্যবহার করা যে কোনও বা শেলের সাথে বেশ উপযুক্ত ।" সত্য, তবে এটি find … -exec mv {} MYDIR \;এবং এর চেয়ে কম সংস্থান ব্যবহার হয় … -exec sh -c 'mv "$@" MYDIR' _ {} \;
স্কট

0

এটি সম্ভবত কিছুটা বিপজ্জনক তবে

cp * destination/
rm *

যেহেতু সিপি এবং আরএম উভয়ই -r সুইচ ব্যতীত ডিরেক্টরিতে কাজ করবে না।


-1

আমি কেবল mv *.* destination/গন্তব্য দিয়ে / আপনি যে ফোল্ডারে চলে যাচ্ছেন তা হওয়ার পরামর্শ দিচ্ছি ।



2
ডিরেক্টরি নামগুলিতে 'ডট' থাকতে পারে এবং ফাইলের নামগুলি এটি বাদ দিতে পারে (এবং প্রায়শই হয়) সুতরাং *.*কিছু ডিরেক্টরি সরানো হবে এবং কিছু ফাইল ছেড়ে যাবে, যা জিজ্ঞাসা চাচ্ছিল তা নয়।
dave_thompson_085

দুঃখিত তবে এটি সম্পূর্ণ ভুল। এটি কেবল তার নামের সাথে বিন্দু দিয়ে যে কোনও কিছু সরিয়ে ফেলবে এবং একটি ছাড়া কিছুই সরিয়ে ফেলবে না। বিন্দু কোনওভাবেই ফাইলগুলির সাথে একচেটিয়া নয় এবং সেগুলিও ফাইলের দ্বারা প্রয়োজন হয় না, সুতরাং এটি কেবল ফাইল এবং ডিরেক্টরিগুলির একটি এলোমেলো নির্বাচন সরিয়ে দেবে।
টেরডন

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