केवल फ़ोल्डर में उप फ़ोल्डर में फ़ाइलों को कैसे स्थानांतरित करें?


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...सभी मिलान फ़ाइलें हैं (धन्यवाद @DavidFoerster)

2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +सुरक्षित होगा (मामले $TARGET_DIRमें कोई निर्देशिका नहीं है या मैच शुरू होता है -) और अधिक कुशल है (क्योंकि यह हर मिलान की गई फ़ाइल के लिए एक नई उप-प्रक्रिया नहीं बनाता है)।
डेविड फ़ॉस्टर

@DavidFoerster धन्यवाद, अपडेट किया गया (आज कुछ नया भी सीखा!)
Frxstrem

5

मुझे लगता है कि आप केवल अपनी फ़ाइलों को एमवी करना चाहते हैं। पहले अपनी निर्देशिका में जाएं और इस कमांड का उपयोग करें, $ TARGET को अपने लक्षित स्थान पथ के साथ बदलें। आप प्रतिलिपि बनाना चाहते हैं अपनी फ़ाइलों को प्रतिस्थापित 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प्रत्यावर्तन नहीं रोकता है।
मार्टिन थॉर्नटन

@MartinThornton आपके सुझाव के लिए धन्यवाद .. मैं अपने उत्तर को संपादित करूँगा ...
एमलशा रसाद

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()फ़ंक्शन का उपयोग करके एक फ़ाइल है।

  • एक बार 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


3

यदि आप बैश के बजाय zsh का उपयोग कर रहे हैं, तो आप यह कर सकते हैं:

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

(.)अंत में एक ग्लोब क्वालीफायर कहा जाता है; .अंदर विशेष रूप से केवल नियमित रूप से फ़ाइलों से मिलान करने का मतलब है।

एक करना mv *(.) "$target"त्वरित और व्यावहारिक है। हालाँकि, यदि आप इसे एक स्क्रिप्ट के हिस्से के रूप में कर रहे हैं, तो आप कुछ और लिखने के बजाय विचार करना चाह सकते हैं जैसे कि Frxstrem और डेविड फॉरेस्टर ने सुझाव दिया mv -t "$target" -- *(.)कि कोने के मामलों को बेहतर ढंग से हैंडल किया जाए जो अन्य लोगों के उपयोग में उत्पन्न हो सकते हैं।


1
जैसा कि डेविड फॉरेस्टर ने मेरे जवाब पर ध्यान दिया, mv -t "$TARGET" -- "$SOURCE"/*(.)सुरक्षित होगा (यदि मामला एक निर्देशिका से "$TARGET"शुरू होता -है)। मैं हालांकि zsh समाधान पसंद है!
Frxstrem

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))

टर्मिनल में रनिंग पायथन फाइल देखें ।


@SergiyKolodyazhnyy मुझे pep-8 में ऐसी आवश्यकता नहीं दिखती है और (उदाहरण के अनुसार) यह वास्तव में बिल्कुल विपरीत है: import mypackageइससे पहलेfrom mypackage import ...
jfs

@SergiyKolodyazhnyy विशेष from __future__आयात और साधारण from pathlibआयात को भ्रमित नहीं करते हैं ।
4

हाँ, ऐसा लगता है कि मैंने उस भाग को गलत समझा है। नहीं, आप सही हैं, import moduleपहले होना चाहिए (जो पुस्तकालय और तीसरे पक्ष का आयात है) from module import objectअंतिम (स्थानीय / पुस्तकालय विशिष्ट) होना चाहिए
सर्जियो कोलोडियाज़नी

0

मैं उपयोग करूंगा

mv *.*

यह तब तक काम करेगा जब तक आपके फ़ोल्डर्स में एक्सटेंशन न हों।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.