আপনি কীভাবে সমস্ত ফাইল (গোপন সহ) এক ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে স্থানান্তর করবেন?


132

আমি কীভাবে একটি ডিরেক্টরিতে সমস্ত ফাইল (লুকানো ফাইলগুলি সহ) অন্য ডিরেক্টরিতে স্থানান্তর করব?

উদাহরণস্বরূপ, যদি আমার ভিতরে ".hid" এবং "notHid" ফাইলগুলির সাথে একটি "ফু" ফোল্ডার থাকে তবে আমি কীভাবে উভয় ফাইলকে "বার" নামের ডিরেক্টরিতে স্থানান্তর করব? "। লুকানো" ফাইলটি "ফু"-তে থাকায় নিম্নলিখিতগুলি কাজ করে না।

mv Foo/* Bar/

এটি নিজে চেষ্টা করো.

mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/


বাহ, আমি জানতাম আমার টাইপ করার আগে উত্তরগুলি সতেজ করা উচিত ছিল। খুব সহায়ক লিঙ্ক।
স্টিভেন ডি

দুঃখের বিষয়, এই প্রশ্নটি এখানেই শেষ হয়েছিল কারণ আমি এসও-তে বলেছিলাম যে এটি এখানে বা এসইউতে স্থানান্তরিত হওয়া উচিত, অবশ্যই এসইউ-তে একটি নকল আগেই এখানে
এসেছিল

ব্যক্তিগতভাবে, আমি মনে করি * নিক্স নির্দিষ্ট প্রশ্ন এবং উত্তরগুলি এসইউ-তে অফ-টপিক হওয়া উচিত। বর্তমান বিধিগুলির সাথে আমরা দুজনের মধ্যে প্রচুর পরিমাণে সামগ্রীর সংঘাতের সমাপ্তি - এই প্রশ্নের মতো।
Cory Klein

উত্তর:


151

Zsh

mv Foo/*(DN) Bar/

অথবা

setopt -s glob_dots
mv Foo/*(N) Bar/

( (N)ডিরেক্টরিটি খালি নয় বলে আপনি যদি ছেড়ে যান ))

সজোরে আঘাত

shopt -s dotglob nullglob
mv Foo/* Bar/

Ksh93

যদি আপনি জানেন ডিরেক্টরিটি খালি নয়:

FIGNORE='.?(.)'
mv Foo/* Bar/

স্ট্যান্ডার্ড (পসিক্স) শি

for x in Foo/* Foo/.[!.]* Foo/..?*; do
  if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done

আপনি যদি mvকমান্ডটি সফল হয়েও ত্রুটির স্থিতি ফিরিয়ে দিতে চান তবে এটি অনেক সহজ:

mv Foo/* Foo/.[!.]* Foo/..?* Bar/

জিএনইউ সন্ধান করুন এবং জিএনইউ এমভি

find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +

স্ট্যান্ডার্ড সন্ধান

যদি আপনি উত্স ডিরেক্টরিতে পরিবর্তন করতে আপত্তি না করেন:

cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "$@" "$0"' ../Bar/ {} + -type d -prune

বাশ, ksh93 এবং zsh এ ডট ফাইলগুলি মিলছে কিনা তা নিয়ন্ত্রণ করার বিষয়ে এখানে আরও বিশদ।

সজোরে আঘাত

dotglobবিকল্পটি সেট করুন ।

$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero

আরও নমনীয় GLOBIGNOREপরিবর্তনশীল রয়েছে , যা আপনি উপেক্ষা করার জন্য ওয়াইল্ডকার্ড নিদর্শনগুলির একটি কোলন-বিচ্ছিন্ন তালিকায় সেট করতে পারেন। যদি আনসেট না করা (ডিফল্ট সেটিংস) থাকে তবে শেলটি এমনটি আচরণ করে যে মান dotglobসেট করা থাকলে শূন্য ছিল .*এবং বিকল্পটি যদি আনসেট না করা হয় তবে মানটি হয় । ম্যানুয়ালটিতে ফাইলের নাম প্রসারণ দেখুন । বিস্তৃত ডিরেক্টরিগুলি .এবং ..সর্বদা বাদ দেওয়া হয়, যদি .না প্যাটার্ন দ্বারা স্পষ্টভাবে মেলে।

$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one

Ksh93

FIGNOREভেরিয়েবল সেট করুন । যদি আনসেট না করা হয় (ডিফল্ট সেটিংস), শেলটি মান হিসাবে আচরণ করে .*। উপেক্ষা করার জন্য .এবং ..এগুলি অবশ্যই স্পষ্টভাবে মিলে যেতে হবে (ksh 93s + ২০০৮-০১-৩১ এর ম্যানুয়ালটিতে বলা হয়েছে .এবং ..সর্বদা উপেক্ষা করা হয়, তবে এটি প্রকৃত আচরণটি সঠিকভাবে বর্ণনা করে না)।

$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero

আপনি একটি ডট ফাইল অন্তর্ভুক্ত করতে পারে প্যাটার্ন তাদের স্পষ্টভাবে মেলানোর মাধ্যমে।

$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero

ডিরেক্টরিটি ফাঁকা থাকলে প্রসারণটি ফাঁকা হয়ে আসতে, Nপ্যাটার্ন মেলানো বিকল্পটি ব্যবহার করুন : ~(N)@(*|.[^.]*|..?*)বা ~(N:*|.[^.]*|..?*)

Zsh

dot_globবিকল্পটি সেট করুন ।

% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero

.এবং ..মিলেছে না হয়, এমনকি যদি প্যাটার্ন নেতৃস্থানীয় মিলে যায় .স্পষ্টভাবে।

% echo .*
..two .one

আপনি D গ্লোব কোয়ালিফায়ারের সাথে একটি নির্দিষ্ট প্যাটারনে ডট ফাইলগুলি অন্তর্ভুক্ত করতে পারেন ।

% echo *(D)
..two .one none zero

যোগ Nসম্প্রসারণ একটি খালি ডিরেক্টরির মধ্যে খালি আসা আউট করতে উল্লিখিত glob কোয়ালিফায়ার: *(DN)


দ্রষ্টব্য: আপনি যদি বিভিন্ন আদেশ মধ্যে ফাইলের নাম সম্প্রসারণ ফলাফল (যেমন, পেতে পারেন noneদ্বারা অনুসরণ .oneদ্বারা অনুসরণ ..two) আপনার সেটিংসের উপর ভিত্তি করে LC_COLLATE, LC_ALLএবং LANGভেরিয়েবল।


1
কেন nullglob? mvকমান্ডটি চালিয়ে যাওয়ার চেয়ে কমান্ডটি (ফিশ, (N)সিএসএস / টিসিএস, জেডএস (বিনা ) করা, বা ফেলগ্লোব দিয়ে ব্যাশ করা) mv /Bar/কমান্ড বাতিল করা আরও অর্থবোধ করবে which
স্টাফেন চেজেলাস

1
আমি বলব আপনার GLOBIGNORE বিবরণটি সঠিক এবং বিভ্রান্তিকর। গ্লোবিগনোরকে একটি খালি-খালি মান হিসাবে সেট করা ডটগ্লোবকে সক্রিয় করে তোলে .এবং ..এটি কখনও মিলে না (যেমন জেডএস, ফিশ, পিডিএক্স এবং ডেরিভেটিভসের মতো অন্যান্য বুদ্ধিমান শেলের মতো) এমনকি যদি আপনি ডটগ্লাবকে পিছনে পিছনে সরিয়ে ফেলেন। ( GLOBIGNORE=:; shopt -u dotglob; echo .*আউটপুট .এবং না ..)। থেকে GLOBIGNORE সেটিং .:..বা .বা :একই প্রভাব আছে।
স্টাফেন চেজেলাস

ksh93সর্বদা উপেক্ষা করা .এবং ..মনে হয় ksh93k+(যেখানে এটি কাজ করেছে) এবং ksh93m(যেখানে এটি আর কাজ করে না ) এর মধ্যে ভেঙে গেছে । মনে রাখবেন যে এটির মধ্যে খারাপ ksh93এটি পরিবেশ থেকে FIGNORE এর মান নেবে, সুতরাং FIGNORE='!(..)'উদাহরণস্বরূপ একটি এনভ ভার্চটি বিপর্যয় সৃষ্টি করতে পারে।
স্টাফেন চেজেলাস

24
#!/bin/bash

shopt -s dotglob
mv Foo/* Bar/

থেকে man bash

ডটগ্লোব যদি সেট করা থাকে তবে ব্যাশে একটি 'দিয়ে শুরু হওয়া ফাইলের নাম অন্তর্ভুক্ত রয়েছে।' পথের নাম প্রসারণের ফলাফলগুলিতে।


ডিরেক্টরিটি খালি থাকলে এই কমান্ডটি একটি ত্রুটি কোডটি ফেরত দেওয়ার সতর্কতার সাথে (যদিও কমান্ডটি আসলে উদ্দেশ্য হিসাবে সম্পাদিত হয়েছিল)।
গিলস

1
@ গিলস, ত্রুটিটি তখন mvঅভিযোগ করা থেকে হবে যে ফাইলটির নাম Foo/*নেই exist মজার বিষয় হল, যদি Fooসন্ধানযোগ্য হয় তবে পঠনযোগ্য নয় এবং সেখানে একটি ফাইল ডেকে আনা *হয়েছে, আপনি কোনও ত্রুটি পাবেন না, সেই ফাইলটি সরানো হবে তবে ডিরেক্টরিটিতে থাকা অন্য ফাইলগুলি নয়। bashএকটি failglobবিকল্প রয়েছে যাতে এটি আরও বেশি পছন্দ করে zsh, fishবা csh/ tcshএবং ত্রুটি সহ কমান্ডটি বাতিল করে দেয় যখন গ্লোবকে যেমন রয়েছে তেমনি রেখে দেওয়ার বগাস আচরণের পরিবর্তে কোনও গ্লোব প্রসারিত করা যায় না।
স্টাফেন চেজেলাস

7

এই না এটি একটি সহজ উপায় bashহল

mv {Foo/*,Foo/.*} Bar/

তবে এটি ডিরেক্টরিগুলিও সরিয়ে ফেলবে।

আপনি যদি লুকানো সহ সমস্ত ফাইল সরিয়ে নিতে চান তবে কোনও ডিরেক্টরি সরাতে না চান তবে আপনি লুপ এবং পরীক্ষার জন্য ব্যবহার করতে পারেন।

for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;


4

একটি উপায় ব্যবহার find:

find Foo/ -type f -exec mv -t Bar/ {} \+

-type fফাইল খোঁজার জন্য find কমান্ডের নিষিদ্ধ। আপনি তদন্ত করা উচিত -type, -maxdepthএবং -mindepthএর অপশন findআপনার আদেশ অ্যাকাউন্টে সাবডিরেক্টরি জন্য কাস্টমাইজ করতে। ফাইন্ডে একটি দীর্ঘ তবে খুব সহায়ক ম্যানুয়াল পৃষ্ঠা রয়েছে


3
এটি কেবল নিয়মিত ফাইলগুলিকে কেবল Foo/সাব-ডাইরেক্টরি এবং অন্যান্য ফাইলগুলিতে সরিয়ে দেয়।
গিলস

2

অনুলিপি কমান্ড চেষ্টা করুন cp:

$ cp -r myfolder/* destinationfolder

cp -r মানে অনুলিপি করা অনুলিপি, সুতরাং সমস্ত ফোল্ডার এবং ফাইলগুলি অনুলিপি করা হবে।

আপনি rmএকটি ফোল্ডার সরানোর জন্য অপসারণ কমান্ডটি ব্যবহার করতে পারেন :

$ rm -r myfolder

আরও দেখুন: সমস্ত ফাইলকে ডিরেক্টরি থেকে অন্য একটিতে সরান


2
আপনি যখন প্রচুর বড় ফাইল সরাচ্ছেন তখন সেরা নয় তবে আমার ধারণা এটি কার্যকর হবে।
কোরি ক্লেইন

আপনি যদি তারার পরিবর্তে বিন্দু ব্যবহার করেন?
ভিনসেন্ট

1

Rsync অন্য বিকল্প:

rsync -axvP --remove-source-files sourcedirectory/ targetdirectory

এটি কাজ করে কারণ rsync এ চলমান স্ল্যাশ সম্পর্কিত বিষয়গুলি sourcedirectory/ডিরেক্টরিটির বিষয়বস্তু উল্লেখ করে, যখন sourcedirectoryডিরেক্টরিটি নিজেই উল্লেখ করে।

এই পদ্ধতির অসুবিধাটি হল যে আরএসসিএনসি কেবল ফাইলটি সরানোর পরে ডিরেক্টরিটি নয় clean সুতরাং আপনার কাছে একটি খালি সোর্সডাইরেক্টরি গাছ থাকবে। তার জন্য কাজের জন্য, দেখুন:

ফাইলগুলি সরান এবং আরএসসিএনসি দিয়ে ডিরেক্টরিগুলি মুছবেন?

সুতরাং চলন্ত ক্রিয়াকলাপগুলির জন্য এটি সর্বোত্তম নাও হতে পারে তবে এটি অনুলিপি অপারেশনের জন্য অত্যন্ত কার্যকর হতে পারে।


1

বাশ / মাছের উত্তর

ওয়াইল্ডকার্ড ব্যবহার করে এটি করার একটি উপায় এখানে রয়েছে:

.[!.]* ..?*এবং বাদে সমস্ত লুকানো ফাইলের সাথে মিলবে...

.[!.]* ..?* *এবং বাদে সমস্ত ফাইল (লুকানো বা না) মিলবে...

এবং আপনার এই প্রশ্নের নির্দিষ্ট উদাহরণটির উত্তর দিতে হবে cd foo && mv .[!.]* ..?* * ../bar

ব্যাখ্যা

.[!.]*এক বিন্দু দিয়ে শুরু ফাইল-নামের সাথে মেলে এবং তারপরে বিন্দু বাদে কোনও অক্ষর option চ্ছিকভাবে কোনও স্ট্রিং অনুসরণ করে। এটি যথেষ্ট নিকটে তবে এটি দুটি বিন্দু দিয়ে শুরু হওয়া ফাইলগুলি মিস করে ..foo। এই জাতীয় ফাইলগুলি অন্তর্ভুক্ত করতে আমরা যুক্ত করব ..?*যা দুটি ডট দিয়ে শুরু হওয়া ফাইল-নামগুলির সাথে মেলে, তারপরে কোনও অক্ষর, বিকল্পের পরে কোনও স্ট্রিং অনুসরণ করে।

পরীক্ষা

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

mkdir temp
cd temp
touch  a  .b  .bc  ..c  ..cd  ...d  ...de
ls .[!.]* ..?*
# you get this output:
          .b  .bc  ..c  ..cd  ...d  ...de
# cleanup
cd ..
rm -rf temp

0

আপনি মুভ কমান্ডের জন্য ফাইলগুলি নির্বাচন করতে ব্যাককোটিসগুলি সহ গ্রেপ করতে এবং পারাতে সক্ষম হতে পারেন। এমভি মধ্যে পাস করুন।

অর্থাত্ লুকানো ফাইলগুলির জন্য

find Foo -maxdepth 1 | egrep '^Foo/[.]' # Output: .hidden

সুতরাং

mv `find Foo -maxdepth 1 | egrep '^Foo/[.]'` Bar # mv Foo/.hidden Bar

কেবলমাত্র নির্বাচিত লুকানো ফাইলগুলিকে এতে সরানো হয় Bar:

mv `find Foo -maxdepth 1 | egrep '^Foo/.'` Bar # mv Foo/.hidden Foo/notHidden Bar

'' সাল থেকে সমস্ত ফাইলকে ফু-তে স্থানান্তরিত করে। egrep কমান্ড বর্গাকার বন্ধনী ছাড়া ওয়াইল্ডকার্ড হিসাবে কাজ করে।

^চরিত্র ম্যাচ লাইনের শুরুতে থেকে শুরু নিশ্চিত করে।

egrepপ্যাটার্ন মিলের কিছু বিশদ এখানে পাওয়া যাবে

maxdepth 1স্টপ ব্যবহার করে সাব-ডিরেক্টরিতে যাওয়া থেকে খুঁজে পাওয়া যায়।


0

এই উত্তর থেকে অনুপ্রাণিত :

ফাইলগুলি অনুলিপি না করে ...

rsync -ax --link-dest=../Foo/ Foo/ Bar

আদেশ সহকারে:

  • --link-destDESTINATION ( Bar উদাহরণে) এর সাথে পথ অবশ্যই নিখুঁত বা আপেক্ষিক হতে হবে

  • আপনি /উত্স পরে রাখবেন ( Foo/উদাহরণস্বরূপ), অন্যথায় এটি সামগ্রীর পরিবর্তে SOURCE ফোল্ডারটি অনুলিপি করবে।


0

আমি দেখতে পেয়েছি যে এটি ব্যাশের জন্য ভাল কাজ করে এবং শেল বিকল্পগুলি পরিবর্তন করার দরকার নেই

mv sourcedir/{*,.[^.]*} destdir/

সম্পাদনা করুন:

সুতরাং জি-ম্যান যেমন বলেছিলেন, আমার মূল উত্তরটি পিক্সিক্সের সাথে সামঞ্জস্যপূর্ণ নয় এবং এটি একটি পরিবর্তনের সাথে উপরের নীডেমোর উত্তর মত একই, যা তারপরে অভিনয় করা স্ট্রিংগুলির তালিকা তৈরি করতে ব্রেস প্রসারণ ব্যবহার করা হয়। এর অর্থ হ'ল cdউত্স ডিরেক্টরিতে আপনাকে প্রবেশ করার দরকার নেই । সত্যিই এত বড় পরিবর্তন নয়, তবে এটি ভিন্ন।

উদাহরণ: ধরা যাক আপনার ইতিমধ্যে নীচের লেআউট রয়েছে।

 $ tree -a
.
├── destdir
└── sourcedir
    ├── ..d1
    ├── ..d2
    ├── ..double
    ├── file-1
    ├── file-2
    ├── .hidden-1
    ├── .hidden-2
    ├── ...t1
    └── ...t2

আসল প্রশ্নটিতে কেবল একটি একক পিরিয়ড সহ লুকানো ফাইলগুলি উল্লেখ করা হয়েছিল তবে আসুন আমরা বলি যে নামের শুরুতে দুটি বা তার বেশি পিরিয়ড সহ কিছু রয়েছে। বন্ধনীগুলিতে আপনি কেবল অতিরিক্ত এক্সপ্রেশন যুক্ত করতে পারেন। আমরা তখন মৃত্যুদন্ড কার্যকর করতে পারি

mv sourcedir/{*,.[!.]*,..?*} destdir/

এটি নিম্নলিখিতটিতে প্রসারিত হয়:

mv sourcedir/file-1 sourcedir/file-2 sourcedir/.hidden-1 sourcedir/.hidden-2 sourcedir/..d1 sourcedir/..d2 sourcedir/..double sourcedir/...t1 sourcedir/...t2 destdir/

আপনার এখন ডাস্টডিরের সমস্ত ফাইল দেখতে হবে :

 $ tree -a
.
├── destdir
   ├── ..d1
   ├── ..d2
   ├── ..double
   ├── file-1
   ├── file-2
   ├── .hidden-1
   ├── .hidden-2
   ├── ...t1
   └── ...t2
└── sourcedir

আপনি 4.x তে আরও সংযোজন সহ ব্যাশে ব্র্যাকস সহ কিছু দুর্দান্ত শীতল জিনিস করতে পারেন। পরীক্ষা করে দেখুন ব্যাশ-হ্যাকার কিছু ছিমছাম উদাহরণের জন্য।


1
আপনি কোঁকড়া ধনুর্বন্ধনী যোগ করা ব্যতীত (এগুলি ব্যাখ্যা না করে) মূলত এটি এনডিএমউর উত্তরটিকে সদৃশ করে। তবে (1) আপনার উত্তর ফাইলগুলির সাথে মেলে না যার নাম দিয়ে শুরু হয় ..এবং (2) পসিক্স অনুগত হতে , আপনার !পরিবর্তে ব্যবহার করা উচিত ^; যেমন  {*,.[!.]*},।
জি ম্যান

@ জি-ম্যান, এ সম্পর্কে দুঃখিত। তাই আপনি সঠিক এবং এনডিএমউ'র প্রতিক্রিয়া না দেখে আমার খারাপ bad তারা প্রায় একই জিনিস। 1. আমার সংস্করণটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ পিক্সিক্স অনুগত নয়। ২. আমি স্ট্রিংয়ের তালিকা তৈরি করতে ব্রেস এক্সপেনশন ব্যবহার করছি যা শেলটি পরে কোন ক্রিয়া সম্পাদন করতে ব্যবহার করবে। এর অর্থ cdএই যে ফাইলগুলিতে কাজ করার জন্য বা সমস্ত ফাইলে পাথ প্রকাশ করার জন্য একই ফাইলের পাথ আমি বার বার লিখতে চাই না directory আমি যে বিষয়ে কথা বলছি তার আরও ভাল চিত্র দেওয়ার জন্য আমি শীঘ্রই উদাহরণটি আপডেট করব।
সেমিেন্ডার sp0ck

0

জন্য ন্যূনতম লিনাক্স ডিস্ট্রো নিম্নলিখিত কাজ করা কর্তব্য। প্রথমে সমস্ত একটি বেসিক মুভ সম্পাদন করুন (যা লুকানো ফাইলগুলি মিস করে)। তারপরে, সমস্ত গোপন ফাইল সরানো (যা সহ .এবং ..যা আসলে সরানো হবে না )।

mv /sourceDir/* /destinationDir 2> /dev/null
mv /sourceDir/.* /destinationDir 2> /dev/null

দ্রষ্টব্য: যদি কোনও দৃশ্যমান সামগ্রী না থাকে তবে প্রথম কমান্ড একটি ত্রুটি বার্তা উত্পন্ন করবে। দ্বিতীয় কমান্ড সর্বদা একটি ত্রুটি উত্পন্ন করে বলবে যে এটি সরাতে পারে না .এবং ..। যেমন, কেবল ত্রুটিগুলি পাইপ করুন /dev/null(দেখানো হয়েছে)।

যদি আপনার ওয়ান-লাইনার হিসাবে এটির প্রয়োজন হয় তবে কেবল সেমি-কোলনের সাথে তাদের একত্র করুন:

mv /sourceDir/* /destinationDir 2> /dev/null; mv /sourceDir/.* /destinationDir 2> /dev/null
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.