जवाबों:
आप से निर्देशिका के अलावा सब कुछ ले जाना चाहते हैं $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)मुझे लगता है कि आप केवल अपनी फ़ाइलों को एमवी करना चाहते हैं। पहले अपनी निर्देशिका में जाएं और इस कमांड का उपयोग करें, $ 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
प्रत्यावर्तन नहीं रोकता है।
जब पुनरावर्ती रूप से फ़ाइलों के साथ काम करते हैं, 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
यदि आप बैश के बजाय zsh का उपयोग कर रहे हैं, तो आप यह कर सकते हैं:
mv "$SOURCE"/*(.) "$TARGET"
(.)
अंत में एक ग्लोब क्वालीफायर कहा जाता है; .
अंदर विशेष रूप से केवल नियमित रूप से फ़ाइलों से मिलान करने का मतलब है।
एक करना mv *(.) "$target"
त्वरित और व्यावहारिक है। हालाँकि, यदि आप इसे एक स्क्रिप्ट के हिस्से के रूप में कर रहे हैं, तो आप कुछ और लिखने के बजाय विचार करना चाह सकते हैं जैसे कि Frxstrem और डेविड फॉरेस्टर ने सुझाव दिया mv -t "$target" -- *(.)
कि कोने के मामलों को बेहतर ढंग से हैंडल किया जाए जो अन्य लोगों के उपयोग में उत्पन्न हो सकते हैं।
mv -t "$TARGET" -- "$SOURCE"/*(.)
सुरक्षित होगा (यदि मामला एक निर्देशिका से "$TARGET"
शुरू होता -
है)। मैं हालांकि 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
में कोई निर्देशिका नहीं है या मैच शुरू होता है-
) और अधिक कुशल है (क्योंकि यह हर मिलान की गई फ़ाइल के लिए एक नई उप-प्रक्रिया नहीं बनाता है)।