केवल फ़ोल्डरों की प्रतिलिपि बनाएँ फाइलें नहीं?


16

क्या एक पूरी निर्देशिका को कॉपी करने का एक तरीका है, लेकिन केवल फ़ोल्डर्स? मेरे पास मेरी निर्देशिका में कहीं भ्रष्ट फ़ाइल है जो मेरी हार्ड डिस्क को विफल करने का कारण बन रही है।

इसलिए भ्रष्ट फ़ाइल को किसी अन्य हार्ड डिस्क पर कॉपी करने के बजाय, मैं केवल फ़ोल्डर्स की प्रतिलिपि बनाना चाहता था, क्योंकि मेरे पास स्क्रिप्ट हैं जो सैकड़ों फ़ोल्डरों की खोज करती हैं, और मैं उन सभी को मैन्युअल रूप से बनाना नहीं चाहता।

मैंने cp मैनुअल को खोजा, लेकिन कुछ भी नहीं देख सका (मैं इसे याद कर सकता था)

कहो कि मेरे पास यह संरचना मेरे असफल HDD पर है:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

मुझे बस एक निर्देशिका संरचना चाहिए, किसी भी फाइल को नहीं।

इसलिए मैं नए HDD के साथ अंत करूंगा:

dir1
    dir2
        dir4
dir3

किसी को उम्मीद है कि कुछ चालें जानता है!


क्या आप इसका मतलब है कि आप केवल डायरेक्टरी स्ट्रिकचर को कॉपी करना चाहते हैं या क्या आपका मतलब सिर्फ यह है कि आप मौजूदा वर्किंग डाइरेक्टरी में फाइल को बाहर करना चाहते हैं (और सभी सब-डिपॉजिटरी में अन्य फाइल गेम हैं)?
ओली

मैंने एक उदाहरण और जोड़ा है। भ्रमित होने के लिए खेद है
शैनन

1
FYI करें rsyncनिर्देशिका संरचना की प्रतिलिपि बनाने और अनुमतियों और विशेषताओं को बनाए रखने के लिए] ( stackoverflow.com/a/9242883/52074 )। सादे का उपयोग mkdir -p अनुमतियों और विशेषताओं को संरक्षित नहीं करता है
ट्रेवर बोयड स्मिथ

जवाबों:


15

यदि आप एक निर्देशिका कंकाल को मिरर करना चाहते हैं और कोई फाइल कॉपी नहीं करना चाहते हैं:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

यहाँ क्या चल रहा है:

  • खोजें केवल निर्देशिका का चयन कर रही है
  • हम गहरी संभव निर्देशिकाओं-links 2 को खोजने के लिए उपयोग कर रहे हैं ।
  • mkdir -p रास्ते में किसी भी लापता निर्देशिका बना देगा।

मैंने इसे इस तरह से किया है, find -type d -exec mkdir -p "/path/to/backup/{}" \;क्योंकि यह mkdirकॉल के पूरे बटुक को काट देगा । हम इसे थोड़ा परीक्षण के साथ जल्दी साबित कर सकते हैं। यहाँ परीक्षण वृक्ष है जो मैंने दो आज्ञाओं की तुलना करने के लिए चलाया था:

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

और यह केवल हजारों निर्देशिकाओं के साथ एक वास्तविक शब्द समाधान में बेहतर होने जा रहा है।


यह मेरे लिए एक नॉब है, हालांकि आप बैकअप के लिए कॉपी करने के लिए पुराने डायर को कैसे खोज रहे हैं? मैं यहां केवल एक ही रास्ता देख सकता हूं
शैनन

यदि आप कोई पथ निर्दिष्ट नहीं करते हैं, findतो वर्तमान कार्यशील निर्देशिका को प्रारंभिक बिंदु के रूप में उपयोग करता है। : यदि आप उपयोग करना चाहते हैं एक और रास्ता सिंटैक्स का उपयोग करेंfind /path/to/search/ -type.....
ओली

इसलिए मैंने अपनी निर्देशिका को एक निश्चित फ़ोल्डर में सेट किया है जिसमें कंकाल है जिसे मैं कॉपी करना चाहता हूं, चलाना चाहता हूं find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;और सब ठीक होना चाहिए? कुछ समय लग रहा है: /
शान्नोन

मैं इसे सामान्य टर्मिनल से चलाता हूं?
शैनन

1
वे दोनों निष्पादन खंड को खोजने के लिए विशिष्ट हैं। {"का अर्थ है वर्तमान" मिला "फ़ाइलनाम और \; खंड को समाप्त करने के लिए सिर्फ पलायन है। इसके बारे में दिखता तक, वहाँ एक अतिरिक्त "कोई अच्छा करने के लिए अपने कोड को में है, मुझे यकीन है ... चाहिए पढ़ें:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
ओली

2

आसानी से अजगर वन-लाइनर के साथ किया जाता है:

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

स्क्रिप्ट के रूप में इसे फिर से लिखा जा सकता है:

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.