কমান্ড-লাইন এমভি বর্জন তালিকা


11

একটি উপায় আছে হয় mv, cpঅথবা যেকোনো ফাইল অপারেশন যেমন যে আমি সব ফাইল আমার নির্দিষ্ট পারে না প্রভাবিত চাও?

উদাহরণস্বরূপ, আমি ফাইলগুলির সাথে একটি ফোল্ডার আছে বলে file1, file2আর file3, আর আমি স্থানান্তর করতে চান file1এবং file2কোথাও। বরং স্পষ্টভাবে সরাতে (ফাইল নামকরণ চেয়ে mv file1 file2 /path/to/destination), আমি ফাইল নাম করতে চান না সরানো এবং অন্যান্য ফোল্ডারে স্থানান্তরিত পেতে আছে ( mv --some-switch file3 /path/to/destination)


আমি বিশ্বাস করি এটি mv file1 file2 /path/to/destinationআপনি যা করতে চান তা করবে না
ফোনেহেহে

উত্তর:


19
  • কোনও নির্দিষ্ট প্যাটার্নের সাথে মিলে যাওয়াগুলি বাদ দিয়ে আপনি ডিরেক্টরিতে সমস্ত ফাইলের সাথে মেলে কয়েকটি শেলের মধ্যে উন্নত গ্লোব্বিং নিদর্শনগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ksh, bash বা zsh এ, কমান্ডটি

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    সব ফাইল সরানো হবে /sourceথেকে /destinationম্যাচিং ফাইলের জন্য ছাড়া *.bak। Zsh এ, আপনি /source/^*.bakপ্রথম চালনা করলে setopt extended_globএবং আরও সাধারণভাবে (আবার প্রয়োজনীয় setopt extended_glob) /source/*~*.bak(বা /source/a*~*.bakসমস্ত ফাইলের জন্য যাদের নাম শুরু হয় ফাইলগুলি aবাদ দিয়ে .bakইত্যাদি) লিখতে পারেন ।

  • জেডএসের একটি গণকপি / মুভ / লিঙ্ক কমান্ড রয়েছে যা অন্যদের মধ্যে, প্যাটার্নের সাথে মিলে যাওয়া ফাইলগুলি বাদ দিয়ে সমস্ত ফাইল সরিয়ে নিতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড ছাড়া সব ফাইল চলে আসে *.bakথেকে /sourceথেকে target, এবং যোগ করে .bakপ্রক্রিয়ায় তাদের নামের:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • renameচারদিকে ভাসমান নামে বেশ কয়েকটি কমান্ড রয়েছে। ডেবিয়ান এবং উবুন্টুতে, /usr/bin/renameএকটি পার্ল স্ক্রিপ্ট যা ফাইলগুলিকে পার্ল এক্সপ্রেশন দ্বারা উত্পন্ন নতুন নামে নিয়ে যায়। আপনি যদি ফাইলটি বাদ দিতে চান তবে নতুন নাম উত্পন্ন না করে ফাইলের নাম পরিবর্তন থেকে বাদ দিতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড (এই নির্দিষ্ট renameপ্রোগ্রামটি ব্যবহার করে ) *.bakথেকে সমস্ত ফাইল সরিয়ে /sourceনিয়েছে /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • আপনি findযে ফাইলগুলি সরাতে চান তা নির্বাচন করতে আপনি কমান্ডটি ব্যবহার করতে পারেন । উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড ছাড়া সমস্ত নিয়মিত ফাইল চলে আসে *.bakমধ্যে /sourceবা মধ্যে একটি সাব /target(নোট যে, ডিরেক্টরি অনুক্রমের সঙ্কুচিত করা হয়):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    বা (সরানোর জন্য অনেকগুলি ফাইল থাকলে আরও কার্যকর)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsyncএকটি সাধারণীকরণ cpএবং scpখুব শক্তিশালী সঙ্গে বিধিগুলি অন্তর্ভুক্ত / বাদ দিন। উদাহরণস্বরূপ, কমান্ড কপি ছাড়া সব ফাইল নিম্নলিখিত *.bakমধ্যে /sourceবা মধ্যে একটি সাব /target, ডিরেক্টরি অনুক্রমের সম্মান:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • paxcpস্টেরয়েডগুলিতে অন্য জিনিসগুলির মধ্যে রয়েছে । এর বাদ দেওয়ার নিয়মগুলি আরএসসিএন-এর মতো প্রায় শক্তিশালী নয়, তবে ফাইলগুলি অনুলিপি করার সাথে সাথে এর নতুন নামকরণের অতিরিক্ত ক্ষমতাও রয়েছে। আপনি যদি খালি স্ট্রিংয়ে কোনও ফাইলের নাম পরিবর্তন করেন তবে এটি অনুলিপি থেকে বাদ দেওয়া হয়। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি *.bakইন /sourceবা একটি উপ-ডিরেক্টরি বাদে সমস্ত ফাইল অনুলিপি /targetকরে .bakএবং পাসিংয়ে ফাইলগুলির নাম পরিবর্তন করে ।

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    উপরের উদাহরণটিতে ডাইরেক্টরিগুলি তৈরি করার দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া রয়েছে foo.bak, যা এর findসাথে একত্রিত হয়ে এড়ানো যায় pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    

অসাধারণ. একটি সম্ভাব্য সংশোধন: আমি মনে করি যে findকমান্ডটি শেষ হওয়া দরকার\;
স্টিভেন ডি

@ স্টিভেন: ধন্যবাদ, আমি ভুলে যাচ্ছি যে আপনি কেবল +অবিলম্বে নিম্নলিখিত ব্যবহার করতে পারেন {}
গিলস 'অশুভ হওয়া বন্ধ করুন'

সুন্দর তালিকা, তার জন্য THX। :-)
ইকক্স

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