फ़ाइलों के एक समूह को स्थानांतरित करें, प्रत्येक फ़ाइल के लिए पुष्टि के लिए उपयोगकर्ता को संकेत दें


9

सिस्टम: उबंटू मेट 18.04।

मेरे पास फाइलों का एक संग्रह है (एक निर्देशिका संरचना में कई निर्देशिकाओं में) और मैं उनमें से कई को दूसरी निर्देशिका में स्थानांतरित करना चाहता हूं। मैं बता सकता हूं कि मैं उनके नाम से कौन सी फाइलें ले जाना चाहता हूं (वे रेसिपी टाइटल हैं), लेकिन उन फाइलों के बीच अंतर करने का कोई और तरीका नहीं है, जिन्हें मैं स्थानांतरित करना चाहता हूं और जिन फाइलों को मैं स्थानांतरित नहीं करना चाहता हूं; मुझे हर फाइल का नाम खुद जांच कर निर्णय लेना होगा।

इसलिए, मैं प्रत्येक फ़ाइल के लिए एक बार एक कमांड चला रहा हूं जिसे मैं स्थानांतरित करना चाहता हूं, जैसे

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

टैब पूरा होने के साथ भी यह बहुत अधिक टाइपिंग है। जो मैं वास्तव में करना चाहता हूं वह कुछ ऐसा है

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

इसलिए मैं सिर्फ yया nहर फाइल के लिए प्रेस कर सकता हूं ।

मैं फ़ाइलों के समूह को कैसे स्थानांतरित कर सकता हूं और हर फ़ाइल के लिए पुष्टि के लिए संकेत दिया जा सकता है ?

जवाबों:


6

तरीका 1: अपने ग्राफ़िकल फ़ाइल ब्राउज़र में, ट्री व्यू का उपयोग करके

मुझे लगता है कि आपका वास्तविक लक्ष्य प्रत्येक फ़ाइल के लिए एक विकल्प बनाना है, न कि सख्ती से संकेत देने के लिए बोलना । हालाँकि, यदि आप टर्मिनल में प्रत्येक फ़ाइल के बारे में संकेत दिया जाना पसंद करते हैं, तो नीचे दिए गए मार्ग 2 को देखें।

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

कुछ फ़ाइल ब्राउज़रों में, किसी को ट्री व्यू को सक्षम करने के लिए प्राथमिकताएँ मेनू में जाना चाहिए। काजा, मेट फ़ाइल ब्राउज़र में, यह हमेशा सूची दृश्य में सक्षम होता है। सूची दृश्य पर जाने के लिए दृश्य → सूची (या प्रेस Ctrl+ 2) पर क्लिक करें । प्रत्येक निर्देशिका में इसके दाईं ओर एक छोटा दायां-सा त्रिभुज होता है, जो दर्शाता है कि इसका विस्तार किया जा सकता है। किसी फ़ोल्डर का विस्तार करने के लिए, उस त्रिकोण पर क्लिक करें, या फ़ोल्डर का चयन करते समय (दायां तीर) कुंजी दबाएं। इस उदाहरण में, मैंने उन सभी को एक-एक करके चुना है और उन सभी को एक बार उनके गंतव्य पर खींच रहा हूँ:

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

स्रोत और गंतव्य को एक ही ड्राइव पर मान लेने से, डिफ़ॉल्ट रूप से चालें चलती हैं। यदि आप इसके बजाय कॉपी करना चाहते हैं, तो आप Ctrlकुंजी दबाए रखेंगे।

ड्रैग-मूव के बाद की स्थिति पूरी हो गई है, जिसमें चुनी गई फाइलें अब अपने मूल अलग-अलग स्थानों के बजाय गंतव्य फ़ोल्डर में एक साथ हैं।

सिद्धांत रूप में, यह ठीक गलतियों के लिए आसान जब इस पद्धति का उपयोग है, क्योंकि (काजा सहित) समर्थन सबसे फ़ाइल ब्राउज़रों Ctrl+ Zबैच कार्यों सहित पूर्ववत हाल कार्रवाई, करने के लिए। हालाँकि, मैंने इसके साथ किस्मत को मिला दिया है। कभी-कभी फाइलें गलत फ़ोल्डर में वापस चली जाती हैं।

अच्छी खबर यह है कि आप ज्यादातर टेक्स्ट दस्तावेजों के साथ काम करते दिखाई देते हैं, जो छोटे होते हैं, इसलिए आप tarबिना किसी परेशानी के पहले अतिरिक्त बैकअप बना सकते हैं । मैं सुझाव देता हूं कि आप किस विधि का उपयोग करते हैं।

रास्ता 2 : कार्रवाई के findसाथ कमांड-ok

findफ़ाइलों का पता लगाना -execऔर -execdirकार्यों के साथ एक मनमाना बाहरी कमांड के लिए उनके मार्ग को पास करना आम बात है । लेकिन findयह भी है -okऔर -okdirहै कि शीघ्र हर बार इससे पहले कि वे एक आदेश चला। यदि आप वास्तव में प्रत्येक फ़ाइल के बारे में टर्मिनल में संकेत देना चाहते हैं, तो मुझे लगता है कि यह जाने का रास्ता है।

जब जैसा ऊपर दिखाया गया है, वैसा ही प्रभाव उत्पन्न करने के लिए किया जाता है:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Textsस्रोत निर्देशिका के साथ बदलें (जो कि हो सकता है .कि आप cd'डी' हो) और Glorious Destination Folderवास्तविक गंतव्य निर्देशिका के साथ।

यह प्रति फ़ाइल एक कमांड चलाता है; विपरीत -execऔर -execdir, -okऔर -okdirसमर्थन नहीं करते +के स्थान पर \;एक आदेश के एक ही मंगलाचरण में एक से अधिक मिली पथ पारित करने के लिए। नतीजतन, आप के रूप का उपयोग करने की जरूरत नहीं -t destहै mv। मैं वैसे भी ऐसा करने का सुझाव देता हूं, हालांकि, दोनों सामान्य रूप से findऔर विशेष रूप से इस स्थिति में इसलिए संकेत उन आदेशों की तरह अधिक दिखते हैं जिनके बारे में वे संकेत दे रहे हैं।

जैसा कि कमांड में लिखा गया है, अगर findएक प्रतीकात्मक लिंक का सामना करता है जो अंततः एक नियमित फ़ाइल की ओर इशारा करता है, तो इसे (लिंक, लक्ष्य नहीं) को अनदेखा करने के बजाय स्थानांतरित किया जाता है। यदि आप वास्तव में सिर्फ एक नियमित फाइल संचालित करना चाहते हैं, तो -type fइसके बजाय उपयोग करें -xtype f

आप इसे एक scriptसत्र में करना चाह सकते हैं ताकि आप यह पता लगा सकें कि गलती होने पर क्या हुआ। लेकिन फिर, कोई कारण नहीं एक बैकअप के लिए।

रास्ता 3: एक प्रकट उत्पन्न करें और इसे संपादित करें

कम से कम इतनी देर तक जब फ़ाइलों में उनके नाम की नई-नई पंक्तियाँ नहीं हैं, तो आप एक साधारण findकमांड का उपयोग करके एक मेनिफ़ेस्ट --a फ़ाइल बनाने के लिए शुरू कर सकते हैं जो उन फ़ाइलों के नामों को सूचीबद्ध करता है जिन्हें आप (इस मामले में संभवतः) रुचि रखते हैं :

find Texts -xtype f >manifest

manifestउस फ़ाइल के लिए जो भी नाम आपको पसंद है उसे बदल दें जो विचाराधीन फाइलों को सूचीबद्ध करता है (और तदनुसार शेष दिशाओं को समायोजित करें)।

ऊपर के रूप में, Textsअपने वास्तविक स्रोत निर्देशिका के साथ बदलें , जो हो सकता है .यदि आप इसे cdकरने के लिए है। हालाँकि, यदि Textsकोई सापेक्ष पथ है (यदि यह शामिल है .) तो आपको बाद में उसी स्थान पर होना सुनिश्चित करना चाहिए जब आप वास्तव में चालें करते हैं।

उस findकमांड को चलाने के बाद , manifestएक टेक्स्ट एडिटर में खोलें । यह हो सकता है nano, vim, emacs, gedit, pluma, आदि संपादक में, बाहर टिप्पणी लाइनों नाम फ़ाइलें है कि आप नहीं है एक रखकर ले जाना चाहते हैं #उन्हें की शुरुआत में। कुछ संपादकों ने उन पंक्तियों को अलग-अलग तरीके से उजागर किया होगा, जबकि यह आपकी फ़ाइल को किसी भी प्रारूप के होने की पहचान नहीं करता है, जो यह जानता है कि इसमें टिप्पणियां हैं। अधिकांश, हालांकि, और वास्तविक कारण मैं इसे इस तरह से करने का सुझाव नहीं देता हूं, यह है कि आप, एक मानव के रूप में, कॉन्फ़िगरेशन फ़ाइलों में (और शायद स्रोत कोड में) लाइनों का अनुभव करने की संभावना रखते हैं। मुझे लगता है कि यह अधिक सहज, और कम त्रुटि वाला है, इससे आप उन पंक्तियों को चिह्नित करना चाहेंगे जिन्हें आप स्थानांतरित करना चाहते हैं।

बेशक, आप इसके बजाय उन फ़ाइलों के लिए लाइनें हटा सकते हैं जिन्हें आप स्थानांतरित नहीं करना चाहते हैं। उन्हें टिप्पणी करने का लाभ यह है कि यह बाद में स्पष्ट हो जाएगा कि आपने क्या किया।

मेरे उदाहरण में, यह वही है जो फ़ाइल की सामग्री ऐसी दिखती थी जैसे मैंने उसे संपादित किया था:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

फिर आप टिप्पणी लाइनों को फ़िल्टर कर सकते हैं grepऔर xargsउन्हें पास करने के लिए परिणाम को पाइप कर सकते हैं mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

ऊपर के रूप Glorious Destination Folderमें, वास्तविक गंतव्य के नाम से प्रतिस्थापित करें। बस; आपकी फ़ाइलें स्थानांतरित हो गई हैं। यदि आप पसंद करते हैं, तो कमांड को देखने के लिए echoपहले लिख सकते mvहैं।

जिस तरह से कमांड काम करता है वह है:

  1. grepआदेश आउटपुट लाइनों से manifestकि नहीं है ( -v) (शुरू ^वैकल्पिक (साथ) *) खाली स्थान के ( \s) एक शाब्दिक द्वारा पीछा #चरित्र। -Pध्वज नियमित अभिव्यक्ति की बोली के रूप में PCRE चयन (जो सक्षम बनाता है \sजो मैं पारंपरिक की तुलना में अधिक पठनीय पर विचार [[:space:]])।
  2. xargsआदेश अपने इनपुट (जिनमें से उत्पादन होता है बांटता grepन्यू लाइन-समाप्त क्षेत्र (में) -d '\n',) तो (समाप्त न्यू लाइन के बिना) प्रत्येक क्षेत्र में चिपकाता आदेश के अंत में एक अलग तर्क के रूप में mv -t 'Glorious Destination Folder'है, जो इसे चलाता है।

1
-okIMHO सबसे अच्छा जवाब
pim

7

यहाँ एक छोटी स्क्रिप्ट है ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

नमूना उपयोग:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

स्क्रिप्ट को निष्पादन योग्य बनाने के लिए मत भूलना ( chmod +x mv-confirm.sh)

एनबी

चूंकि मैं आपकी फ़ाइलों के साथ गड़बड़ नहीं करना चाहता, इसलिए मैंने echoवास्तविक mv कमांड से पहले जोड़ा । वास्तव में फ़ाइलों को स्थानांतरित करने के लिए इसे हटाने के लिए स्वतंत्र महसूस करें।

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