বর্তমান ফোল্ডারে থাকা ফাইলগুলি কীভাবে একটি সাব ফোল্ডারে স্থানান্তরিত করবেন?


9

আমাকে ফোল্ডারগুলি সরানো হবে না, কেবল ফাইলগুলি।

আমি চেষ্টা করেছি mv *কিন্তু এই কমান্ডটি ফোল্ডারগুলিও সরিয়ে নিয়েছে।

উত্তর:


13

আপনার কাছ থেকে ডিরেক্টরি ছাড়া সবকিছু স্থানান্তর করতে চান তাহলে $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...সব মিলিয়ে ফাইল আছে (ধন্যবাদ @ ডেভিডফোরস্টার)

2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +নিরাপদ হবে (যদি $TARGET_DIRকোনও ডিরেক্টরি না থাকে বা ম্যাচটি শুরু হয় না -) এবং আরও কার্যকর (কারণ এটি প্রতিটি মিলিত ফাইলের জন্য একটি নতুন উপ-প্রক্রিয়া উত্সাহ দেয় না)।
ডেভিড ফোরস্টার

@ ডেভিডফোস্টার ধন্যবাদ, আপডেট হয়েছে (আজও নতুন কিছু শিখেছে!)
ফ্রেক্সস্ট্রেম

5

আমি মনে করি আপনি কেবল আপনার ফাইলগুলি এমভি করতে চান 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পুনরাবৃত্তির বাধা দেয় না।
মার্টিন থর্নটন

@ মার্টিনথর্টন আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ জানায় .. আমি আমার উত্তরটি সম্পাদনা করব ...
এমলশা রসাদ

3

পাইথন পদ্ধতির

পুনরাবৃত্তভাবে ফাইলগুলির সাথে ডিল করার সময়, 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

এখানে আর একটি পাইথন পদ্ধতি রয়েছে
jfs

3

আপনি যদি বাশের পরিবর্তে zsh ব্যবহার করছেন তবে আপনি এটি করতে পারেন:

mv "$SOURCE"/*(.) "$TARGET"

(.)শেষে একটি উল্লিখিত glob কোয়ালিফায়ার বলা হয়; .ভিতরে বিশেষভাবে শুধুমাত্র নিয়মিত ফাইল মেলে মানে।

একটি mv *(.) "$target"কাজ করা দ্রুত এবং বাস্তব। যাইহোক, আপনি যদি কোনও স্ক্রিপ্টের অংশ হিসাবে এটি করছেন তবে আপনি mv -t "$target" -- *(.)অন্যদের ব্যবহারে উত্থিত হতে পারে এমন কোণার কেসগুলি আরও ভালভাবে পরিচালনা করার জন্য ফ্রেক্সস্ট্রেম এবং ডেভিড ফোরস্টার যে পরামর্শ দিয়েছেন তার মতো কিছু লেখার পরিবর্তে বিবেচনা করতে চাইতে পারেন ।


1
যেমন ডেভিড ফোরস্টার আমার উত্তরটির দিকে ইঙ্গিত করেছেন, mv -t "$TARGET" -- "$SOURCE"/*(.)নিরাপদ হবে (ক্ষেত্রে যদি কোনও ডিরেক্টরি "$TARGET"দিয়ে শুরু হয় -বা নয়) not আমি যদিও zsh সমাধান পছন্দ করি!
ফ্রেক্সস্ট্রেম

2

পাইথনে ডিরেক্টরি থেকে 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 ...
jfs

বিশেষত from __future__আমদানি এবং সাধারণ from pathlibআমদানিগুলিকে সংশয় করবেন না
jfs

হ্যাঁ, দেখে মনে হচ্ছে আমি সেই অংশটি ভুলভাবে লিখেছি। না, আপনি ঠিক বলেছেন, import moduleপ্রথম হওয়া উচিত (যা গ্রন্থাগার এবং তৃতীয় পক্ষের আমদানিগুলি) from module import objectশেষ হওয়া উচিত (স্থানীয় / লাইব্রেরি নির্দিষ্ট)
সের্গি কলডিয়াজহনি

0

আমি ব্যবহার করব

mv *.*

আপনার ফোল্ডারে এক্সটেনশন না থাকলে এটি কাজ করবে।

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