نحوه کپی و انتقال فایل در لینوکس

دستور انتقال فایل در لینوکس
Avatar
نویسنده: دریا آزادخواه
چهارشنبه 1 مهر 1405
مطالعه: ۱۴ دقیقه ۰ نظر ۷۹۱۹ بازدید

انتقال و کپی فایل یکی از ابتدایی‌ترین و در عین حال پرکاربردترین کارهایی است که هر کاربر لینوکسی، دیر یا زود، با آن سروکار پیدا می‌کند. از جابه‌جایی یک فایل پیکربندی بین دو پوشه گرفته تا انتقال چند گیگابایت داده بین دو سرور مجزا. لینوکس برای هر یک از این سناریوها، ابزار یا دستور مشخصی در اختیار کاربر قرار می‌دهد که یادگیری آن‌ها کار روزمره با سرور را ساده‌تر، سریع‌تر و ایمن‌تر می‌کند. در این مقاله از بخش آموزش لینوکس در وبلاگ پارس‌پک، به‌طور کامل با دستورهای mv، cp، scp و rsync آشنا می‌شوید، تفاوت‌های آن‌ها را می‌آموزید و یاد می‌گیرید چطور فایل‌ها و پوشه‌ها را هم به‌صورت محلی و هم بین دو سرور مختلف منتقل یا کپی کنید.

اهمیت انتقال فایل در لینوکس

بخش بزرگی از کار روزمره با سرورهای لینوکسی، جابه‌جایی داده‌هاست. از گرفتن نسخه پشتیبان از فایل‌های پیکربندی و انتقال آن‌ها به یک مسیر امن، تا استقرار (Deploy) فایل‌های یک پروژه روی سرور تولید یا همگام‌سازی داده‌ها بین چند سرور. اگر این کار به‌درستی و با دستور مناسب انجام نشود، ممکن است داده‌ها با تاخیر زیاد منتقل شوند، سطح دسترسی یا مالکیت فایل‌ها به‌هم بریزد یا حتی در میانه انتقال، بخشی از اطلاعات ناقص یا آسیب‌دیده باقی بماند.
به همین دلیل، آشنایی با دستورات لینوکس مرتبط با کپی و انتقال فایل و انتخاب درست بین آن‌ها بر اساس نوع نیاز (لوکال یا از راه دور، حجم پایین یا حجم بالا، یک‌باره یا تکرار شونده)، مستقیما روی امنیت داده‌ها و سرعت مدیریت سرور تاثیر می‌گذارد.

دستور mv برای انتقال فایل در لینوکس

دستور 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/

برای کنترل بیشتر روی رفتار دستور، معمولاً از این گزینه‌ها استفاده می‌شود:

گزینه توضیح
-i پیش از رونویسی روی فایل مقصد، از کاربر تایید می‌گیرد. برای جلوگیری از حذف تصادفی داده، استفاده از این گزینه توصیه می‌شود.
-f بدون هیچ پرسشی، فایل مقصد را در صورت هم‌نام بودن بازنویسی می‌کند.
-v جزئیات هر عملیات انتقال را روی خروجی ترمینال نمایش می‌دهد.
-u فقط زمانی فایل را جابه‌جا می‌کند که فایل مبدا جدیدتر از فایل مقصد باشد یا مقصد وجود نداشته باشد.
-n هرگز فایل مقصد را بازنویسی نمی‌کند، حتی اگر f- هم داده شده باشد.

دستور cp برای کپی‌کردن فایل‌ها در لینوکس

دستور cp برای کپی‌کردن فایل‌ها در لینوکس
دستور cp برای کپی‌کردن فایل‌ها در لینوکس

دستور 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

برای کپی‌کردن یک فایل از دایرکتوری فعلی به مسیری دیگر، به سادگی از دستور زیر استفاده کنید:

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 در لینوکس

برای کنترل دقیق‌تر روی نحوه اجرای عملیات کپی، می‌توانید از گزینه‌های زیر همراه با دستور cp استفاده کنید:

گزینه نام توضیح
-v Verbose جزئیات کپی‌شدن هر فایل را به صورت هم‌زمان روی ترمینال نمایش می‌دهد. برای پیگیری روند کپی حجم بالای فایل‌ها مفید است.
-p Preserve ویژگی‌های فایل اصلی مانند تاریخ ایجاد، زمان تغییر و مجوزهای دسترسی را در فایل کپی‌شده حفظ می‌کند.
-f Force فایل هم‌نام موجود در مقصد را بدون هشدار بازنویسی می‌کند.
-i Interactive پیش از رونویسی روی فایل مقصد، از کاربر تایید می‌گیرد. استفاده از این گزینه برای جلوگیری از پاک‌شدن ناخواسته داده‌ها توصیه می‌شود.
-R Recursive تمام فایل‌ها و زیرپوشه‌های یک دایرکتوری را به صورت کامل کپی می‌کند.
-u Update فایل را فقط زمانی کپی می‌کند که فایل مبدا جدیدتر از فایل مقصد باشد یا اصلا در مقصد وجود نداشته باشد.

دستور scp برای انتقال فایل بین دو سیستم با SSH

دستور scp برای انتقال فایل بین دو سیستم با SSH
دستور scp برای انتقال فایل بین دو سیستم با SSH

وقتی نیاز باشد فایلی بین دو سرور لینوکسی مختلف و از طریق شبکه منتقل شود، دستورهای 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 ./

برخی از گزینه‌های پرکاربرد این دستور عبارت‌اند از:

گزینه نام توضیح
-r Recursive برای کپی‌کردن کامل یک دایرکتوری به همراه تمام زیرپوشه‌ها و فایل‌های آن استفاده می‌شود.
-P Port پورت اتصال SSH را در صورتی که با مقدار پیش‌فرض 22 متفاوت باشد، مشخص می‌کند.
-i Identity File مسیر فایل کلید خصوصی (Private Key) را برای اتصال بدون رمز عبور تعیین می‌کند.
-C Compression داده‌ها را پیش از انتقال فشرده می‌کند تا سرعت انتقال روی شبکه‌های کم‌پهنای‌باند بهبود یابد.

اگر دو سرور لینوکسی دارید و می‌خواهید علاوه بر scp، با روش‌های دیگر انتقال فایل بین آن‌ها هم آشنا شوید، مطالعه مقاله انتقال فایل بین دو سرور لینوکس می‌تواند مکمل خوبی برای این بخش باشد.

کپی در لینوکس با استفاده از دستور rsync

دستور 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 را به مقصد منتقل می‌کند.

دستور scp و rsync چه تفاوتی با یکدیگر دارند؟

هرچند هر دو دستور برای انتقال امن فایل روی SSH استفاده می‌شوند، تفاوت‌های عملی مهمی بین آن‌ها وجود دارد:

  • الگوریتم انتقال: scp همیشه کل فایل را از ابتدا تا انتها منتقل می‌کند، اما rsync فقط تفاوت (Delta) بین نسخه مبدا و مقصد را ارسال می‌کند.
  • سرعت در انتقال‌های تکراری: برای هم‌گام‌سازی مکرر یک پوشه که بخش کوچکی از آن تغییر کرده، rsync به مراتب سریع‌تر از scp عمل می‌کند.
  • قابلیت از سرگیری (Resume): اگر انتقال با rsync به هر دلیلی قطع شود، می‌توانید با گزینه partial– همان عملیات را از همان نقطه ادامه دهید. این قابلیت در scp وجود ندارد.
  • سادگی: برای یک انتقال ساده و یک‌باره، scp به دلیل سینتکس کوتاه‌تر، سریع‌تر قابل استفاده است. در حالی که rsync برای تنظیم دقیق‌تر، گزینه‌های بیشتری در اختیار کاربر قرار می‌دهد.

سایر روش‌های انتقال و کپی فایل در لینوکس

علاوه بر دستورهای اصلی معرفی‌شده، چند روش دیگر هم برای انتقال و کپی فایل در لینوکس وجود دارد که بسته به شرایط می‌توانند مناسب‌تر باشند:

روش FTP و SFTP

پروتکل FTP یکی از قدیمی‌ترین روش‌های انتقال فایل بین سرورهاست، اما داده‌ها را رمزنگاری‌نشده منتقل می‌کند. به همین دلیل نسخه امن آن یعنی SFTP، که روی پروتکل SSH اجرا می‌شود، گزینه توصیه‌شده‌تری است. کلاینت‌های گرافیکی مانند FileZilla هم امکان استفاده از این دو پروتکل را بدون نیاز به خط فرمان فراهم می‌کنند.

روش SSHFS

با این ابزار می‌توانید یک دایرکتوری روی سرور راه‌دور را از طریق SSH، مستقیما روی سیستم خودتان مانت (Mount) کنید و سپس مانند یک پوشه محلی، با همان دستورهای cp و mv با آن کار کنید.

روش Rclone

برای انتقال فایل بین لینوکس و سرویس‌های ذخیره‌سازی ابری (مانند فضای ابری سازگار با S3)، ابزار rclone گزینه مناسبی است و از بسیاری از پروتکل‌های ذخیره‌سازی ابری پشتیبانی می‌کند.

در کنار این ابزارها، دو دستور مکمل ls و cd هم در فرایند کپی و انتقال فایل به شما کمک می‌کنند. برای فهرست‌کردن محتویات یک دایرکتوری و اطمینان از انجام‌شدن صحیح عملیات کپی، کافی است بنویسید:

ls /directory

برای جابه‌جایی بین دایرکتوری‌ها هم از دستور cd به همراه نام مسیر استفاده می‌شود:

cd /other_directory

مشکلات رایج هنگام انتقال فایل

مشکلات رایج هنگام انتقال فایل
مشکلات رایج هنگام انتقال فایل

در حین کار با دستورهای معرفی‌شده، ممکن است با چند خطای رایج مواجه شوید. شناخت این خطاها، عیب‌یابی را بسیار سریع‌تر می‌کند:

  • Permission denied: این خطا معمولا زمانی رخ می‌دهد که کاربر جاری به فایل یا دایرکتوری مقصد دسترسی نوشتن ندارد. راه‌حل آن اجرای دستور با sudo یا تغییر مالکیت و مجوز فایل با دستورهای chown و chmod است.
  • cp: omitting directory: این پیام زمانی نمایش داده می‌شود که بخواهید یک دایرکتوری را بدون گزینه R- کپی کنید. کافی است این گزینه را به دستور اضافه کنید.
  • No such file or directory: معمولا به دلیل اشتباه‌نویسی مسیر یا نبود فایل در مسیر مشخص‌شده رخ می‌دهد. بررسی مسیر با دستور pwd یا استفاده از مسیر کامل (Absolute Path) مشکل را برطرف می‌کند.
  • No space left on device: یعنی فضای دیسک مقصد پر شده است. با دستور df -h می‌توانید فضای خالی هر پارتیشن را بررسی کنید.
  • Connection refused (در scp و rsync): این خطا معمولا به این معناست که سرویس SSH روی سرور مقصد فعال نیست یا پورت مربوطه در فایروال بسته است. بررسی وضعیت سرویس sshd و تنظیمات فایروال معمولا مشکل را حل می‌کند.

جمع‌بندی

در این مقاله از آموزش لینوکس پارس‌پک، مهم‌ترین دستورهای انتقال و کپی فایل در لینوکس را بررسی کردیم. دستور mv برای جابه‌جایی یا تغییر نام فایل در همان سیستم به کار می‌رود، cp نسخه‌ای جدید از فایل می‌سازد بدون آن‌که فایل اصلی را حذف کند، scp فایل را با رمزنگاری SSH بین دو سیستم منتقل می‌کند و rsync با انتقال هوشمند تفاوت‌ها، بهترین گزینه برای هم‌گام‌سازی مکرر دایرکتوری‌های حجیم است. انتخاب درست بین این چهار ابزار، بسته به این‌که انتقال محلی است یا راه‌دور و یک‌باره است یا تکرارشونده، می‌تواند در زمان و پهنای باند صرفه‌جویی قابل‌توجهی ایجاد کند.

سوالات متداول

۱. چگونه در لینوکس فایل را منتقل کنیم؟

ساده‌ترین راه، استفاده از دستور mv است. کافی است نام فایل مبدا و مسیر مقصد را جلوی هم بنویسید، برای مثال:
mv file.txt /path/to/destination

اگر انتقال بین دو سرور مختلف مدنظرتان است، باید از دستورهای scp یا rsync روی SSH استفاده کنید.

۲. روش افزایش سرعت انتقال فایل در لینوکس چیست؟

برای انتقال‌های راه‌دور، استفاده از rsync به همراه گزینه فشرده‌سازی z-، انتخاب سرور با پهنای باند بالا و اجرای انتقال روی سرور مجازی لینوکس پرسرعت، سرعت انتقال را به طور محسوسی افزایش می‌دهد. همچنین محدود کردن ترافیک با گزینه bwlimit– در rsync کمک می‌کند از اشباع‌شدن پهنای باند شبکه در حین انتقال‌های حجیم جلوگیری شود.

۳. دستور cp در لینوکس چه کاربردی دارد؟

دستور cp برای ساخت یک نسخه کپی از فایل یا دایرکتوری استفاده می‌شود، بدون این‌که فایل اصلی حذف یا جابه‌جا شود. این دستور بیشتر برای گرفتن نسخه پشتیبان از فایل‌های پیکربندی یا کپی‌کردن داده بین دو مسیر محلی کاربرد دارد.

۴. دستور mv در لینوکس چه زمانی استفاده می‌شود؟

دستور mv زمانی به کار می‌رود که بخواهید یک فایل یا دایرکتوری را به مکان دیگری منتقل کنید یا صرفا نام آن را تغییر دهید. برخلاف cp، این دستور فایل را از مسیر اصلی حذف می‌کند و نسخه‌ای اضافه در مقصد باقی نمی‌گذارد.