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


2

मैंने एक कमांड चलाया है जिसमें कुछ सर्च मापदंड के आधार पर बहुत सारी फाइलें मिलती हैं। यह फाइल को इस तरह लौटाता है:

./somepath/somepath/file.something
./asdf/asdf/s.php
./etc/a.php
./a/b/c/d/e/f/g.jpg

तो मैं सोच रहा था, अगर मैं इस आउटपुट को एक फ़ाइल (यानी प्रति पंक्ति एक फ़ाइल) में कैद कर लूं, तो क्या कोई मुझे एक कमांड लिखने में मदद कर सकता है जो फ़ाइल के माध्यम से पुनरावृत्त करता है और एक निर्दिष्ट निर्देशिका में एक-एक करके फ़ाइलों को स्थानांतरित करता है?

पहले ही, आपका बहुत धन्यवाद।

जवाबों:


3
while read -r filename
  do
  mv -- "$filename" directory
done < list_of_files.txt

परीक्षण नहीं किया गया (मैं एक काम कर रहा हूँ पीसी पर विंडोज चल रहा है) लेकिन काम करना चाहिए।


मूल दृष्टिकोण ध्वनि है, लेकिन आपका मूल संस्करण "असामान्य" फ़ाइलनाम के खिलाफ कई सुरक्षा गायब था। हमेशा उपयोग करें read -r, क्योंकि सादा readकुछ बैकस्लैश का विस्तार करता है। जब तक आप नहीं जानते, तब तक चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें ; उद्धरण के बिना, शेल व्हाट्सएप और \[?*फ़ाइल नामों में विस्तार करेगा । अंत में, कमांड लाइन --पर फ़ाइल नाम से पहले mvकमांड -द्वारा एक विकल्प माने जाने वाले फ़ाइल नाम से सुरक्षा करता है mv
गाइल्स

आप बिल्कुल सही हैं। उचित देखभाल के बिना इसे बंद कर दिया - सुधार के लिए धन्यवाद।
CarlF

धन्यवाद! मैंने इसे खुद भी आजमाया और 30 लाइन की php स्क्रिप्ट के साथ समाप्त हुआ।
mqchen

2
your_command | xargs -I% mv "%" dest_dir

यदि आपकी आज्ञा है findया आपके पास नल के साथ फ़ाइलनाम समाप्त करने का कोई तरीका है:

your_command | xargs -0 -I% mv "%" dest_dir

या

find [find-args] -print0 | xargs -0 -I% mv "%" dest_dir

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

xargsयदि आपने पहले ही इसे बनाया है, तो आप अपनी फ़ाइल को संसाधित करने के लिए भी उपयोग कर सकते हैं :

xargs -a filename -I% mv "%" dest_dir

जब आप उन्हें स्थानांतरित करना चाहते हैं तो आप फ़ाइलों को हटाने के निर्देश क्यों दे रहे हैं?
frabjous

मैं शर्त लगा रहा हूं कि डेनिस ने एक उदाहरण से नकल की और इसे अनुकूलित नहीं किया।
CarlF

नहीं, मैंने इसकी नकल नहीं की। मैं फाउल-अप का पूरा श्रेय लेता हूं। मैं अपने उदाहरणों को सही करूंगा।
डेनिस विलियमसन

@ मेकचेन: -I%डेनिस के जवाब में ध्यान दें । यह महत्वपूर्ण है: इसके बिना, xargsअजीब तरीके से उद्धृत इनपुट की अपेक्षा करता है और विफल हो जाएगा यदि आपकी फ़ाइल नामों में व्हाट्सएप और जैसे अक्षर हैं \'"
गिल्स

-1

एक अन्य विकल्प, यदि फ़ाइल नाम में कोई व्हाट्सएप नहीं है, तो होगा

mv `search_command_here` dest_directory

(बैकटिक सिंटैक्स भी बैश-इस्म है, लेकिन यह प्रश्न विशेष रूप से बताता है कि यह लिनक्स पर है और सभी प्रमुख लिनक्स डिस्ट्रोफ डिफ़ॉल्ट रूप से बैश का उपयोग करते हैं।)


बैकटिक सिंटैक्स लिनक्स / यूनिक्स-इसम हो सकता है, लेकिन यह बैशिज़्म नहीं है। हर प्रमुख शेल इसका उपयोग करता है। यहां तक ​​कि पसंदीदा $()सिंटैक्स भी बैशिज़्म नहीं है क्योंकि यह अधिकांश आधुनिक गोले में उपलब्ध है और पोसिक्स द्वारा निर्दिष्ट है।
डेनिस विलियमसन

न केवल व्हाट्सएप, बल्कि वाइल्डकार्ड ( *?[) और फ़ाइल नामों में बैकस्लैश का विस्तार इस कमांड के साथ शेल द्वारा किया जाएगा।
गाइल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.