نحوه کپی و انتقال فایل در لینوکس
در این مقاله میخوانید
انتقال و کپی فایل یکی از ابتداییترین و در عین حال پرکاربردترین کارهایی است که هر کاربر لینوکسی، دیر یا زود، با آن سروکار پیدا میکند. از جابهجایی یک فایل پیکربندی بین دو پوشه گرفته تا انتقال چند گیگابایت داده بین دو سرور مجزا. لینوکس برای هر یک از این سناریوها، ابزار یا دستور مشخصی در اختیار کاربر قرار میدهد که یادگیری آنها کار روزمره با سرور را سادهتر، سریعتر و ایمنتر میکند. در این مقاله از بخش آموزش لینوکس در وبلاگ پارسپک، بهطور کامل با دستورهای 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 روش اصلی کپیکردن فایلها در سیستمعامل لینوکس است و برخلاف 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

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

