লিনাক্সের "ফাইন্ড" ফাংশনগুলিতে ফাইলগুলি অনুলিপি এবং নামকরণ কীভাবে করবেন?


17

আমার কাছে একটি ফোল্ডার /home/user/tempsরয়েছে যার মধ্যে 487 ফোল্ডার রয়েছে। প্রতিটি ফোল্ডারে আমার কাছে thumb.png নামে একটি ফাইল রয়েছে।

আমি থাম্ব.পিএনজি নামের সমস্ত ফাইল একটি পৃথক ফোল্ডারে অনুলিপি করতে চাই এবং সেগুলি যে ফোল্ডারটি এসেছিল তার উপর ভিত্তি করে তাদের পুনরায় নামকরণ করতে চাই।


তাদের নতুন নামকরণ, কীভাবে? আপনি যদি ডিরেক্টরি ডিলিমিটারটি কোনও কিছুর সাথে প্রতিস্থাপন করেন - আসুন আন্ডারলাইন (_) বলুন, আপনি ফাইলগুলির সাথে সংঘর্ষ পেতে পারেন, যার মধ্যে ইতিমধ্যে একটি আন্ডারলাইন রয়েছে। এটি প্রতিটি বৈধ অক্ষরের জন্য সত্য, এবং / এবং \ 0 এর পাশে, যা ফাইলের নামগুলিতে নিষিদ্ধ, কোনও নিরাপদ আশ্রয় নেই - যে কোনও অক্ষর সংঘর্ষের কারণ হতে পারে।
ব্যবহারকারী অজানা

ফোল্ডারগুলিতে কি সাবফোল্ডার রয়েছে, বা কেবল একটি সরল, প্রশস্ত ফোল্ডার কাঠামো আছে?
ব্যবহারকারী অজানা

উত্তর:


8

আপনি এখানে যান:

for file in /home/user/temps/*/thumb.png; do new_file=${file/temps/new_folder}; cp "$file" "${new_file/\/thumb/}"; done;

সম্পাদনা:

ক্যানোনিকাল প্রজ্ঞা, যাইহোক, এর জন্য ব্যবহার findকরা একটি খারাপ ধারণা - কেবল শেল প্রসারকে ব্যবহার করা আরও নির্ভরযোগ্য। এছাড়াও, এটি ধরে নেওয়া হয় bash, তবে আমি অনুভব করি এটি একটি নিরাপদ অনুমান :)

সম্পাদনা 2:

স্পষ্টতার জন্য, আমি এটিকে ভেঙে দেব:

# shell-expansion to loop specified files
for file in /home/user/temps/*/thumb.png; do

    # replace 'temps' with 'new_folder' in the path
    # '/home/temps/abc/thumb.png' becomes '/home/new_folder/abc/thumb.png'
    new_file=${file/temps/new_folder};

    # drop '/thumb' from the path
    # '/home/new_folder/abc/thumb.png' becomes '/home/new_folder/abc.png'
    cp "$file" "${new_file/\/thumb/}";
done;

${var/Pattern/Replacement}নির্মাণ সম্পর্কিত বিবরণ এখানে পাওয়া যাবে

cpলাইনে থাকা উদ্ধৃতিগুলি ফাইলের নামগুলিতে স্পেস এবং নিউলাইন ইত্যাদি পরিচালনা করতে গুরুত্বপূর্ণ।


new_file = new_folder? স্ল্যাশ এর সামনে ব্যাকস্ল্যাশ এর উদ্দেশ্য কী new_file/\/thumb?
ব্যবহারকারী অজানা

1
@ ব্যবহারকারীর: প্রতিস্থাপন পাঠ্যের পরিবর্তে প্যাটার্নটির সাথে ${VARIABLE/PATTTERN/REPLACEMENT}মানটির উত্পাদন করে VARIABLE। এখানে প্যাটার্নটি হ'ল /thumb( /যাতে পালানো দরকার যাতে এটির মতো না লাগে ${new_file//PATTERN/REPLACEMENT}, যা এটি প্রথম-ঘটনাস্থলের পরিবর্তে বিশ্বব্যাপী প্রতিস্থাপন করে) এবং প্রতিস্থাপন পাঠ্যটি খালি।
গিলস

অবশ্যই, এখন আমি এটি দেখতে। :)
ব্যবহারকারী অজানা

1
আপনি ধরে নিচ্ছেন যে 487 ডিরেক্টরিগুলি সরাসরি অধীনে রয়েছে /home/user/temps, যা প্রশ্ন থেকে পরিষ্কার নয়। যদি সেগুলি না হয় তবে আপনার সন্ধান বা প্রয়োজন **
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

@ গিলস - আমি প্রকৃতপক্ষে, আমি এইভাবেই প্রশ্নটি পড়ি। পয়েন্টটি প্রশংসা করুন, যদিও :)
সাইমন

5

এটি নির্বিচারে গভীর সাব-ডিরেক্টরিতে কাজ করে:

$ find temps/ -name "thumb.png" | while IFS= read -r NAME; do cp -v "$NAME" "separate/${NAME//\//_}"; done
`temps/thumb.png' -> `separate/temps_thumb.png'
`temps/dir3/thumb.png' -> `separate/temps_dir3_thumb.png'
`temps/dir3/dir31/thumb.png' -> `separate/temps_dir3_dir31_thumb.png'
`temps/dir3/dir32/thumb.png' -> `separate/temps_dir3_dir32_thumb.png'
`temps/dir1/thumb.png' -> `separate/temps_dir1_thumb.png'
`temps/dir2/thumb.png' -> `separate/temps_dir2_thumb.png'
`temps/dir2/dir21/thumb.png' -> `separate/temps_dir2_dir21_thumb.png'

আন্তঃসংশ্লিষ্ট অংশটি প্যারামিটার সম্প্রসারণ ${NAME//\//_} । এটা তোলে বিষয়বস্তুর লাগে NAME, এবং প্রতিটি occurence প্রতিস্থাপন /সঙ্গে _

দ্রষ্টব্য: ফলাফলটি ওয়ার্কিং ডিরেক্টরি এবং সন্ধানের জন্য পরামিতিগুলির উপর নির্ভরশীল। টেম্পসের পিতামহিত ডিরেক্টরি থেকে কমান্ডটি কার্যকর করেছি। পরীক্ষার cpসাথে প্রতিস্থাপন করুন echo


তাদের নামে একটি নতুন লাইন থাকা ফাইলগুলিতে ব্যর্থ।
ব্যবহারকারী অজানা

ভাল যে খুব ভাল কাজ করেছে। আরও একটি বিষয়, আমার কিছু উপ ডিরেক্টরিতে কয়েকটি জিপ ফাইলও রয়েছে। সেখান থেকেও ইমগা বের করা কি সম্ভব? মনে রাখবেন 'জিপ না টার'
মিরাজ

1

সংক্ষিপ্ত সহায়ক কোড:

#!/bin/bash
#
# echo cp "$1" ../tmp/"${1//\//_}" 
#
mv "$1" ../tmp/"${1//\//_}"

এর নাম 'deslash.sh' রাখি এবং এটি কার্যকর করা যায়। এটির সাথে কল করুন:

find -type f -name thumb.png -exec ./deslash.sh {} ";"    

এটি ব্যর্থ হবে, যদি কোনও সংঘর্ষের উপস্থিতি থাকে

a/b/thumb.png # and 
a_b/thumb.png 

তবে তা অনিবার্য।


0

এটা চেষ্টা কর

mkdir /home/user/thumbs
targDir=/home/user/thumbs

cd /home/user/temps

find . -type d | 
 while IFS="" read -r dir ; do
   if [[ -f "${dir}"/thumb.png ]] ; then
     echo mv -i "${dir}/thumb.png" "${targDir}/${dir}_thumb.png"
   fi
done

সম্পাদন করা

আপনার যে কোনও দির নামের মধ্যে সাদা স্পেস অক্ষর এম্বেড থাকলে সে ক্ষেত্রে আমি উদ্ধৃতি যোগ করেছি।

এছাড়াও আমি এটি পরিবর্তন করেছি তাই এটি হবে কেবল কার্যকর করা কমান্ডগুলি মুদ্রণ । স্ক্রিপ্টের আউটপুট পরীক্ষা করে দেখুন যে সমস্ত ফাইল / পাথের নাম যথাযথ দেখাচ্ছে। যখন আপনি নিশ্চিত হন যে আদেশগুলি কার্যকর করা হবে তাতে কোনও সমস্যা নেই, তখন এটি সরিয়ে দিন echo


আমার আরও কয়েকটি সাব-ফোল্ডারে কিছু পিএনজি ফাইল রয়েছে, সেগুলি কি কাজ করবে
মিরাজেজ

আমার "এ এ"-ফোল্ডারের জন্য এটি তৈরি করে: mv -i ./A A/thumb.png ../tmp/.png- সমস্ত ফাইল শেষ হয় ../tmp/.png (../tmp আমার টার্গেট ডিয়ার)।
ব্যবহারকারী অজানা

উপরের কোডে সমস্ত ভেরিয়েবলের চারপাশে উদ্ধৃতি এবং কোঁকড়া ধনুর্বন্ধনী যুক্ত করুন, যেমন "$
ir

@ মিরর ৫১ লিখেছেন: "আরও কয়েকটি সাবফোল্ডারে ফাইলগুলি কাজ করবে"। হ্যাঁ এটা করা উচিত। আপনি কি জানেন যে আপনি এই স্ক্রিপ্টের প্রতিটি পদক্ষেপটি পৃথকভাবে চালিত করতে পারেন (বা পাইপগুলির একসাথে পাইপ দেওয়ার সময়)। আপনি কেবল কার্যকর করতে find -type dপারেন এবং আউটপুট দেখতে পারেন। আপনি যে ডিরেক্টরিটি আশা করেছিলেন সেগুলি কি তা পেতে পারে? এটি হওয়া উচিত নয়, দয়া করে সমস্যাটি দেখানোর জন্য কিছু আউটপুট যুক্ত করুন। শুভকামনা
শেল্টার

কাজ হবে না। read dirশব্দ বিভাজন সম্পাদন করে এবং ডিরেক্টরি a\nbএবং ক এবং বি থেকে দুটি উদাহরণ হিসাবে গ্রহণ করে, যা কোনও মাস্কিং সমাধান করতে পারে না।
ব্যবহারকারী অজানা

-1

অনুলিপি করতে আপনার সিপি কমান্ডের প্রয়োজন , এবং লিনাক্সের নাম পরিবর্তন করা ফাইলটি সরানোর চেয়ে সমান, সুতরাং আপনাকে এটি এমভি কমান্ড দিয়ে করতে হবে । লিনাক্সে আপনাকে সর্বদা পুরো পথটি নির্দিষ্ট করতে হবে, উত্স থেকে, যদি আপনি অন্য ফোল্ডারে থাকেন তবে অবশ্যই গন্তব্য ফোল্ডারে যেতে হবে। কপির জন্য আমি এই জাতীয় কিছু হব:

cp /source_path/file /destination_path/

অথবা নাম পরিবর্তন বা সরানো

mv /source_path/old_file /destination_path/new_name_file

এটি পোস্টারের প্রশ্নের সামান্য অংশ। এখন কীভাবে ডিরেক্টরিগুলিতে পুনরাবৃত্তি হবে এবং থাম্বনেইলগুলি অনুলিপি করুন :-)

ওপি ব্যবহার করতে চায়find

হ্যাঁ, আপনি ঠিক বলেছেন ... আমার কী হয়েছিল আমি জানি না ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.