نحوه کپی و انتقال فایل در لینوکس
انتقال و کپی فایل یکی از ابتداییترین و در عین حال پرکاربردترین کارهایی است که هر کاربر لینوکسی، دیر یا زود، با آن سروکار پیدا میکند. از جابهجایی یک فایل پیکربندی بین دو پوشه گرفته تا انتقال چند گیگابایت داده بین دو سرور مجزا. لینوکس برای هر یک از این سناریوها، ابزار یا دستور مشخصی در اختیار کاربر قرار میدهد که یادگیری آنها کار روزمره با سرور را سادهتر، با سرعتتر و ایمنتر میکند. در این مقاله از بخش آموزش لینوکس در وبلاگ پارسپک، بهطور مفصل با دستورهای mv، cp، scp و rsync آشنا میشوید، تفاوتهای آنها را میآموزید و یاد میگیرید چطور فایلها و پوشهها را هم بهصورت محلی و هم بین دو سرور مختلف منتقل یا کپی کنید.
بخش بزرگی از کار روزمره با سرورهای لینوکسی، جابهجایی دادههاست. از گرفتن ویرایش پشتیبان از فایلهای پیکربندی و انتقال آنها به یک مسیر امن، تا استقرار (Deploy) فایلهای یک پروژه روی سرور تولید یا همگامسازی دادهها بین چند سرور. اگر این کار بهدرستی و با دستور مناسب انجام نشود، ممکن است دادهها با تاخیر زیاد منتقل شوند، سطح دسترسی یا مالکیت فایلها بههم بریزد یا حتی در میانه انتقال، بخشی از دادهها ناقص یا آسیبدیده باقی بماند.
به همین دلیل، آشنایی با دستورات لینوکس مرتبط با کپی و انتقال فایل و انتخاب درست بین آنها طبق نوع نیاز (لوکال یا از راه دور، حجم پایین یا حجم بالا، یکباره یا تکرار شونده)، مستقیما روی امنیت دادهها و سرعت مدیریت سرور تاثیر میگذارد.
دستور mv (مخفف move) برای جابهجاکردن فایلها و دایرکتوریها در سیستمعامل لینوکس استفاده میشود. نکته مهم این است که برخلاف cp، این دستور از فایل مبدا ویرایشبرداری نمیکند، بلکه خود فایل را به مکان تازه منتقل و آن را از مسیر قبلی حذف میکند. از همین دستور برای تغییر نام فایل یا پوشه هم استفاده میشود، چون لینوکس دستور جداگانهای برای تغییر نام ندارد. ساختار کلی دستور بهاینصورت است:
mv [options] source destination
برای انتقال یک فایل به دایرکتوری دیگر، کافی است بنویسید:
mv report.txt /var/backups/
اگر مقصد بهجای یک دایرکتوری، یک نام فایل باشد، mv همان عملیات تغییر نام را انجام میدهد:
mv report.txt report-old.txt
میتوانید چند فایل را همزمان به یک دایرکتوری منتقل کنید. در این حالت، آخرین آرگومان حتماً باید یک دایرکتوری باشد:
mv file1.txt file2.txt file3.txt /var/backups/
برای کنترل بیشتر روی رفتار دستور، معمولاً از این گزینهها استفاده میشود:
دستور cp روش اصلی کپیکردن فایلها در سیستمعامل لینوکس است و برخلاف mv، از فایل اصلی یک ویرایش تازه میسازد و خود فایل مبدا دستنخورده باقی میماند. تمامی توزیعهای لینوکس این دستور را به صورت پیشفرض در اختیار کاربر قرار میدهند. فرمت کلی دستور به این ترتیب است:
cp [options] source_file target_file
برای مثال:
cp my_file.txt my_file2.txt
این دستور یک کپی از فایل my_file.txt میسازد و نام ویرایش نوین را my_file2.txt میگذارد. به صورت پیشفرض، cp در همان دایرکتوریای اجرا میشود که کاربر در آن قرار دارد. به همین دلیل، برای ساخت یک کپی در همان مسیر جاری، باید نام فایل مقصد را تغییر دهید تا با فایل اصلی تداخل پیدا نکند. برخی کاربران برای این کار پسوند old_ را به انتهای نام فایل اضافه میکنند، برخی دیگر از شماره استفاده میکنند و عدهای هم پسوند مشخصی مانند bak. را به جای پسوند اصلی قرار میدهند. در هر حالت، بهتر است پسوند اصلی فایل کپیشده را به خاطر بسپارید تا در صورت نیاز بتوانید آن را به فرمت اولیه بازگردانید.
برای کپیکردن یک فایل از دایرکتوری فعلی به مسیری دیگر، به سادگی از دستور زیر استفاده کنید:
cp my_file.txt /new_directory
در این روش، چون مقصد دایرکتوری دیگری است، نیازی به تغییر نام فایل نیست. درست مثل ویندوز که میتوان دو فایل همنام را در دو درایو متفاوت نگه داشت. برای مشخصکردن مسیر جامع فایل مبدا نیز میتوانید بنویسید:
cp /etc/my_file.txt /new_directory
پوشه مقصد (new_directory) باید از قبل وجود داشته باشد (مثلا با دستور mkdir). در غیر این صورت، اگر یک فایل را به یک مسیر غیر موجود کپی کنید، سیستم آن را به عنوان یک فایل تازه با آن نام در نظر میگیرد و پوشهای ساخته نمیشود. برای تغییر نام فایل همزمان با کپیکردن آن در مسیری دیگر، کافی است نام بهروز را در انتهای مسیر مقصد بیاورید:
cp my_file.txt /new_directory/my_file2.txt
این روش برای گرفتن نسخه جدید پشتیبان از فایلهای پیکربندی یا انتقال داده به حافظههای جانبی و فضای ذخیرهسازی بسیار کاربردی است. به خصوص روی سرورهایی که لینوکس روی آنها اجرا میشود، این قابلیت به حفظ امنیت دادهها و پیشگیری از خرابی فایلها کمک زیادی میکند.
با دستور cp میتوانید چندین فایل را همزمان از یک دایرکتوری به دایرکتوری دیگر کپی کنید. کافی است هر فایلی که باید کپی شود را پیش از مسیر مقصد فهرست کنید:
cp my_file.txt my_file2.txt my_file3.txt /new_directory
این دستور از سه فایل مشخصشده، یک ادیشن در پوشه /new_directory میسازد. برای انتخاب گروهی فایلهایی که یک الگوی مشترک دارند نیز میتوانید از کاراکترهای جایگزین (Wildcard) استفاده کنید:
cp /pictures/*.jpg /new_directory
با اجرای این دستور، تمام فایلهای با پسوند jpg. در پوشه pictures/ تحلیل و در پوشه new_directory/ کپی میشوند. برای کپیکردن دقیق یک پوشه به همراه تمام زیرپوشهها و فایلهای داخل آن، باید از گزینه بازگشتی (Recursive) استفاده کنید:
cp -R /documents /new_directory
گزینه R- مخفف Recursive است و به این معناست که تمام محتوای پوشه، شامل فایلها و زیردایرکتوریها، در مسیر تازه کپی خواهد شد. بدون این گزینه، اجرای cp روی یک دایرکتوری با خطای «امیتشدن دایرکتوری» (omitting directory) متوقف میشود.
برای کنترل دقیقتر روی نحوه اجرای عملیات کپی، میتوانید از گزینههای زیر همراه با دستور cp استفاده کنید:
وقتی نیاز باشد فایلی بین دو سرور لینوکسی مختلف و از طریق شبکه منتقل شود، دستورهای mv و cp دیگر کافی نیستند. در این حالت باید از ابزارهایی استفاده کرد که روی پروتکل SSH کار میکنند. scp (مخفف Secure Copy Protocol) دقیقا چنین ابزاری است و فایلها را با همان سطح رمزنگاری SSH، بین سیستم محلی و یک سرور راهدور، یا بین دو سرور راهدور، جابهجا میکند. برای استفاده از این دستور به نصب بودن OpenSSH و باز بودن پورت SSH (به طور پیشفرض ۲۲) در فایروال هر دو سمت نیاز دارید. ساختار کلی دستور به این صورت است:
scp [options] source_file username@destination_host:/path/to/destination
برای مثال، برای انتقال یک فایل از سیستم محلی به یک سرور:
scp report.txt user@192.168.1.10:/home/user/backup/
برای انتقال در جهت عکس، یعنی دریافت فایل از سرور راهدور:
scp user@192.168.1.10:/home/user/report.txt ./
برخی از گزینههای پرکاربرد این دستور عبارتاند از:
اگر دو سرور لینوکسی دارید و میخواهید علاوه بر scp، با روشهای دیگر انتقال فایل بین آنها هم آشنا شوید، مطالعه مقاله انتقال فایل بین دو سرور لینوکس میتواند مکمل خوبی برای این بخش باشد.
دستور rsync یکی از کاربردیترین ابزارهای لینوکس برای همگامسازی (Synchronization) یا انتقال داده بین دو مکان است. کاربرد آن شبیه cp و scp است، اما تفاوت مهمی دارد. rsync پیش از انتقال، فایلهای مبدا و مقصد را با هم مقایسه میکند و فقط بخشهایی را منتقل میکند که تغییر کردهاند. همین قابلیت، آن را برای همگامسازی مکرر دایرکتوریهای حجیم یا پروژههایی که مرتب ارتقا میشوند، بسیار شتابانتر و کممصرفتر از نظر پهنای باند میکند. برای کپیکردن یک فایل با rsync میتوانید بنویسید:
rsync -a my_file.txt /new_directory/my_file_backup.txt
در این دستور، گزینه a- به معنای حالت آرشیو است و مالکیت فایل، زمان تغییر، پیوندهای نمادین و سایر متادیتای فایل را در طول کپی حفظ میکند. برای همگامسازی یک دایرکتوری مفصل بین دو سرور از طریق SSH، دستور به این شکل نوشته میشود:
rsync -avz -e 'ssh -p 22' /etc/docker/ user@192.168.1.10:/home/backup/docker/
در این مثال، گزینه z- دادهها را پیش از ارسال فشرده میکند، v- شرحات عملیات را نمایش میدهد و e- مشخص میکند که rsync باید از پروتکل SSH برای اتصال استفاده کند. به وجود یا نبود اسلش (/) در انتهای مسیرها هم دقت کنید. چون در rsync، اسلش انتهایی روی اینکه محتوای پوشه منتقل شود یا خود پوشه، تاثیر مستقیم دارد.
نکته:
در خصوص رفتار اسلش (/) در پایان کار مسیر باید بدانید که دو نوع مفصلا متفاوت وجود دارد:
src (بدون اسلش در انتها): خود پوشه src را داخل مقصد کپی میکند.
src/ (با اسلش در انتها): فقط محتویات داخل پوشه src را به مقصد منتقل میکند.
هرچند هر دو دستور برای انتقال امن فایل روی SSH استفاده میشوند، تفاوتهای عملی مهمی بین آنها وجود دارد:
علاوه بر دستورهای اصلی معرفیشده، چند روش دیگر هم برای انتقال و کپی فایل در لینوکس وجود دارد که بسته به شرایط میتوانند مناسبتر باشند:
پروتکل FTP یکی از قدیمیترین روشهای انتقال فایل بین سرورهاست، اما دادهها را رمزنگارینشده منتقل میکند. به همین دلیل نسخه جدید امن آن یعنی SFTP، که روی پروتکل SSH اجرا میشود، گزینه توصیهشدهتری است. کلاینتهای گرافیکی مانند FileZilla هم فرصت استفاده از این دو پروتکل را بدون نیاز به خط فرمان فراهم میکنند.
با این ابزار میتوانید یک دایرکتوری روی سرور راهدور را از طریق SSH، مستقیما روی سیستم خودتان مانت (Mount) کنید و سپس مانند یک پوشه محلی، با همان دستورهای cp و mv با آن کار کنید.
برای انتقال فایل بین لینوکس و سرویسهای ذخیرهسازی ابری (مانند فضای ابری سازگار با S3)، ابزار rclone گزینه مناسبی است و از بسیاری از پروتکلهای ذخیرهسازی ابری پشتیبانی میکند.
در کنار این ابزارها، دو دستور مکمل ls و cd هم در فرایند کپی و انتقال فایل به شما کمک میکنند. برای فهرستکردن محتویات یک دایرکتوری و اطمینان از انجامشدن صحیح عملیات کپی، کافی است بنویسید:
ls /directory
برای جابهجایی بین دایرکتوریها هم از دستور cd به همراه نام مسیر استفاده میشود:
cd /other_directory
مشکلات رایج هنگام انتقال فایل
در حین کار با دستورهای معرفیشده، ممکن است با چند خطای رایج مواجه شوید. شناخت این خطاها، عیبیابی را بسیار شتابانتر میکند:
در این مقاله از آموزش لینوکس پارسپک، مهمترین دستورهای انتقال و کپی فایل در لینوکس را ارزیابی کردیم. دستور mv برای جابهجایی یا تغییر نام فایل در همان سیستم به کار میرود، cp ویرایشای نوین از فایل میسازد بدون آنکه فایل اصلی را حذف کند، scp فایل را با رمزنگاری SSH بین دو سیستم منتقل میکند و rsync با انتقال هوشمند تفاوتها، بهترین گزینه برای همگامسازی مکرر دایرکتوریهای حجیم است. انتخاب درست بین این چهار ابزار، بسته به اینکه انتقال محلی است یا راهدور و یکباره است یا تکرارشونده، میتواند در زمان و پهنای باند صرفهجویی قابلتوجهی ایجاد کند.
سادهترین راه، استفاده از دستور mv است. کافی است نام فایل مبدا و مسیر مقصد را جلوی هم بنویسید، برای مثال:
mv file.txt /path/to/destination
اگر انتقال بین دو سرور مختلف مدنظرتان است، باید از دستورهای scp یا rsync روی SSH استفاده کنید.
برای انتقالهای راهدور، استفاده از rsync به همراه گزینه فشردهسازی z-، انتخاب سرور با پهنای باند بالا و اجرای انتقال روی سرور مجازی لینوکس پرسرعت، سرعت انتقال را به طور محسوسی صعود میدهد. علاوه بر این محدود کردن ترافیک با گزینه bwlimit– در rsync کمک میکند از اشباعشدن پهنای باند شبکه در حین انتقالهای حجیم جلوگیری شود.
دستور cp برای ساخت یک ادیشن کپی از فایل یا دایرکتوری استفاده میشود، بدون اینکه فایل اصلی حذف یا جابهجا شود. این دستور بیشتر برای گرفتن نسخه جدید پشتیبان از فایلهای پیکربندی یا کپیکردن داده بین دو مسیر محلی کاربرد دارد.
دستور mv زمانی به کار میرود که بخواهید یک فایل یا دایرکتوری را به مکان دیگری منتقل کنید یا صرفا نام آن را تغییر دهید. برخلاف cp، این دستور فایل را از مسیر اصلی حذف میکند و ویرایشای اضافه در مقصد باقی نمیگذارد.
سوالات متداول
چرا نحوه کپی و انتقال فایل در لینوکس اهمیت دارد؟
این موضوع به دلیل اطلاعات و کاربردهای مرتبط، مورد توجه کاربران قرار گرفته است.
مهمترین نکات درباره دستور چیست؟
جزئیات مهم و نکات قابل توجه درباره دستور در متن مقاله بررسی شده است.
نحوه کپی و انتقال فایل در لینوکس چیست؟
در این مطلب اطلاعات، جزئیات و نکات مرتبط با نحوه کپی و انتقال فایل در لینوکس بررسی شده است.
