উত্তর:
আপনার কাছ থেকে ডিরেক্টরি ছাড়া সবকিছু স্থানান্তর করতে চান তাহলে $SOURCE_DIRকরতে $TARGET_DIR, আপনি এই কমান্ড ব্যবহার করতে পারেন:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
বিস্তারিত ব্যাখ্যা করা হয়েছে:
find: ডিরেক্টরিতে ফাইলগুলির সন্ধান করুন$SOURCE_DIR: অনুসন্ধান করার জন্য ডিরেক্টরি-maxdepth 1: উপ-ডিরেক্টরি ভিতরে না তাকান-not -type d: ডিরেক্টরি উপেক্ষা করুন
-type fযদি কেবল কঠোরভাবে ফাইলযুক্ত জিনিসগুলি অনুলিপি করতে চান তবে আপনিও ব্যবহার করতে পারেন তবে আমি উপরেরটিকে পছন্দ করি কারণ এটি ফাইল বা ডিরেক্টরি নয় এমন সমস্ত কিছুই ধরে রাখে (বিশেষত প্রতীকী লিঙ্কগুলিতে)-exec mv -t "$TARGET_DIR" -- '{}' +: কমান্ডটি চালান mv -t "$TARGET_DIR" -- FILES...যেখানে FILES...সব মিলিয়ে ফাইল আছে (ধন্যবাদ @ ডেভিডফোরস্টার)আমি মনে করি আপনি কেবল আপনার ফাইলগুলি এমভি করতে চান irst প্রথমটি আপনার ডিরেক্টরিতে যান এবং এই আদেশটি ব্যবহার করুন,, টার্গেটকে আপনার টার্গেট ডিরেক্টরি পথের সাথে প্রতিস্থাপন করুন। আপনি অনুলিপি করতে চান তাহলে আপনার ফাইল প্রতিস্থাপন mvসঙ্গে cp।
find . -type f -exec mv {} $TARGET \;
যদি আমি এটি ব্যাখ্যা করি, find . -type fমানে সমস্ত ফাইল নির্বাচন করুন এবং -exec mv {} $TARGET \;অর্থ mvনির্বাচিত সমস্ত আইটেমকে আদেশ কার্যকর করুন ।
পূর্ববর্তী উত্তরের একটি ত্রুটি রয়েছে .. এটি mvসাব ডিরেক্টরিগুলির মধ্যে থাকা সমস্ত ফাইলও। দ্রুত সমাধান ব্যবহার হয় -maxdepth 1। এরপরে এটি mvসাব ডিরেক্টরিগুলির মধ্যে পুনরাবৃত্তভাবে ফাইলগুলি দেয় না । নীচে সঠিক এক ..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type fপুনরাবৃত্তির বাধা দেয় না।
পুনরাবৃত্তভাবে ফাইলগুলির সাথে ডিল করার সময়, findযাওয়ার উপায়। এই বিশেষ ক্ষেত্রে এটি প্রয়োজনীয় নয়, তবে -maxdepth 1অন্যান্য উত্তর শো হিসাবে ব্যবহার করা যেতে পারে ।
সাধারণ পাইথন কমান্ড এটিও করতে পারে। এখানে একটি উদাহরণ:
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]os.listdir('.')খুঁজে পাওয়া সমস্ত আইটেমগুলিতে পুনরাবৃত্তি হয় এবং আমরা পরীক্ষা করি যে os.path.isfile()ফাংশনটি ব্যবহার করে আইটেমটি কোনও ফাইল whether
একবার flফাইল তালিকা তৈরি হয়ে গেলে , আমরা map()ফাংশনটি ব্যবহার করি । এই ফাংশনটিতে দুটি আর্গুমেন্ট লাগে - একটি ফাংশন এবং আইটেমের তালিকা; এটি ফাংশনটি সম্পাদন করবে যা আমরা একটি লিস্টে প্রতিটি ফাইল প্রতি এটি দিয়েছি। সুতরাং এখানে আমাদের lambda x:shutil.move(x,'./a_directory')বেনামে ফাংশন রয়েছে যা এএ দেওয়া ফাইলটিকে একটি প্রদত্ত ডিরেক্টরিতে স্থানান্তরিত করবে এবং তারপরে আমাদের রয়েছে fl- আমরা তৈরি করা ফাইলগুলির তালিকা।
পঠনযোগ্যতা এবং সাধারণ ব্যবহারের জন্য, আমরা এটি একটি সাধারণ পাইথন স্ক্রিপ্ট হিসাবে আবারও লিখতে পারি, যা দুটি আর্গুমেন্ট গ্রহণ করে - উত্স ডিরেক্টরি এবং গন্তব্য উপ-ডিরেক্টরি।
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
এবং ব্যবহার যেমন হয়:
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
আপনি যদি বাশের পরিবর্তে zsh ব্যবহার করছেন তবে আপনি এটি করতে পারেন:
mv "$SOURCE"/*(.) "$TARGET"
(.)শেষে একটি উল্লিখিত glob কোয়ালিফায়ার বলা হয়; .ভিতরে বিশেষভাবে শুধুমাত্র নিয়মিত ফাইল মেলে মানে।
একটি mv *(.) "$target"কাজ করা দ্রুত এবং বাস্তব। যাইহোক, আপনি যদি কোনও স্ক্রিপ্টের অংশ হিসাবে এটি করছেন তবে আপনি mv -t "$target" -- *(.)অন্যদের ব্যবহারে উত্থিত হতে পারে এমন কোণার কেসগুলি আরও ভালভাবে পরিচালনা করার জন্য ফ্রেক্সস্ট্রেম এবং ডেভিড ফোরস্টার যে পরামর্শ দিয়েছেন তার মতো কিছু লেখার পরিবর্তে বিবেচনা করতে চাইতে পারেন ।
mv -t "$TARGET" -- "$SOURCE"/*(.)নিরাপদ হবে (ক্ষেত্রে যদি কোনও ডিরেক্টরি "$TARGET"দিয়ে শুরু হয় -বা নয়) not আমি যদিও zsh সমাধান পছন্দ করি!
পাইথনে ডিরেক্টরি থেকে source-dirডিরেক্টরি বাদে সমস্ত কিছু সরিয়ে নিতে destination-dir:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
টার্মিনালে পাইথন ফাইল চালানো দেখুন ।
import mypackageআগেfrom mypackage import ...
from __future__আমদানি এবং সাধারণ from pathlibআমদানিগুলিকে সংশয় করবেন না
import moduleপ্রথম হওয়া উচিত (যা গ্রন্থাগার এবং তৃতীয় পক্ষের আমদানিগুলি) from module import objectশেষ হওয়া উচিত (স্থানীয় / লাইব্রেরি নির্দিষ্ট)
আমি ব্যবহার করব
mv *.*
আপনার ফোল্ডারে এক্সটেনশন না থাকলে এটি কাজ করবে।
find ... -exec mv -t "$TARGET_DIR" -- '{}' +নিরাপদ হবে (যদি$TARGET_DIRকোনও ডিরেক্টরি না থাকে বা ম্যাচটি শুরু হয় না-) এবং আরও কার্যকর (কারণ এটি প্রতিটি মিলিত ফাইলের জন্য একটি নতুন উপ-প্রক্রিয়া উত্সাহ দেয় না)।