مدیریت فایلها و دایرکتوریها و کپی و انتقال فایلها یکی از بنیادیترین مهارتهایی است که هر کاربر، توسعهدهنده یا مدیر سرور لینوکس باید به آن مسلط باشد. اگرچه محیطهای دسکتاپ لینوکس (مانند GNOME یا KDE) ابزارهای گرافیکی سادهای برای «کپی و پیست» یا کشیدن و رها کردن (Drag & Drop) فایلها دارند، اما قدرت واقعی لینوکس در خط فرمان (Command Line) یا همان ترمینال نهفته است؛ جایی که میتوانید هزاران فایل را در کسری از ثانیه فیلتر، کپی، جابهجا یا بین سرورهای مختلف در سراسر جهان منتقل کنید.
در این مقاله، صفر تا صد نحوه کپی و انتقال فایلها در لینوکس را بررسی میکنیم؛ از دستورات سادهای مثل cp و mv برای کارهای روزمره گرفته تا ابزارهای پیشرفتهای مانند rsync و scp برای انتقال فایل در شبکه و سرورها.

کپی کردن فایلها و پوشهها به صورت محلی با دستور cp
دستور cp (مخفف Copy) ابزار اصلی برای ایجاد رونوشت از فایلها و دایرکتوریها در لینوکس است. ساختار کلی این دستور به شکل زیر است:
cp [options] source destination
در این ساختار، source فایل یا پوشه مبدا و destination مسیر یا نام مقصد است.
۱. کپی کردن یک فایل در همان پوشه یا پوشهای دیگر
سادهترین حالت استفاده، تهیه یک نسخه پشتیبان از یک فایل در همان دایرکتوری فعلی با نام جدید است:
cp config.yaml config-backup.yaml
اگر بخواهید فایل را به دایرکتوری دیگری کپی کنید (با حفظ نام فعلی)، کافی است مسیر مقصد را بنویسید:
cp config.yaml /var/www/html/
همچنین میتوانید همزمان با کپی کردن به مسیر جدید، نام فایل را هم تغییر دهید:
cp config.yaml /var/www/html/production-config.yaml
۲. کپی کردن چندین فایل به صورت همزمان
برای کپی کردن چند فایل مختلف به یک پوشه مشخص، نام فایلها را پشت سر هم بنویسید و در انتها مسیر مقصد را قرار دهید:
cp index.html style.css app.js /var/www/html/
۳. کپی کردن دایرکتوریها (پوشهها) با سوئیچ `-r`
اگر سعی کنید یک پوشه را به تنهایی با دستور `cp` کپی کنید، با خطای `omitting directory` مواجه میشوید. به صورت پیشفرض، `cp` فقط روی فایلها کار میکند. برای کپی کردن یک دایرکتوری به همراه تمام زیرپوشهها و فایلهای درون آن، باید از سوئیچ `-r` یا `-R` (مخفف Recursive یا بازگشتی) استفاده کنید:
cp -r /var/www/mywebsite /var/backups/mywebsite_backup
۴. حفظ سطح دسترسیها و مالکیت فایل با سوئیچ `-p` و `-a`
وقتی فایلی را به روش معمولی کپی میکنید، فایل جدید مالکیت (Ownership) کاربری که دستور را اجرا کرده میگیرد و زمان ایجاد آن نیز به لحظه حال تغییر میکند. در محیطهای سرور و برنامهنویسی، تغییر سطح دسترسیها (Permissions) میتواند باعث از کار افتادن سرویسها شود.
سوئیچ `-p` (Preserve): سطح دسترسی، مالکیت و برچسبهای زمانی (Timestamps) فایل اصلی را حفظ میکند.
سوئیچ `-a` (Archive): این سوئیچ ترکیبی از چند سوئیچ مهم (از جمله `-r` و `-p`) است و بهترین گزینه برای بکاپگیری دقیق از دایرکتوریها به همراه لینکهای نمادین (Symlinks) است:
cp -a /etc/nginx/ /root/nginx_backup/
۵. جلوگیری از بازنویسی ناخواسته فایلها
به طور پیشفرض، اگر فایلی همنام در مقصد وجود داشته باشد، دستور cp بدون هیچ هشداری فایل قبلی را پاک کرده و فایل جدید را جایگزین (Overwrite) میکند. برای مدیریت این رفتار از سوئیچهای زیر استفاده کنید:
سوئیچ `-i` (Interactive): قبل از جایگزینی فایل، از شما تاییدیه (`y/n`) میگیرد.
سوئیچ `-n` (No Clobber): به هیچ وجه فایلهای موجود در مقصد را بازنویسی نمیکند.
سوئیچ `-u` (Update): فقط در صورتی فایل را کپی میکند که فایل مبدا جدیدتر از فایل موجود در مقصد باشد یا فایل اصلاً در مقصد وجود نداشته باشد.
سوئیچ `-v` (Verbose): گزارش کاری که در حال انجام است را خط به خط روی صفحه نمایش میدهد.
cp -riv project_files/ /mnt/storage/

انتقال و تغییر نام فایلها با دستور mv
دستور mv (مخفف Move) در لینوکس دو وظیفه اصلی را انجام میدهد: انتقال فایلها/پوشهها از جایی به جای دیگر و تغییر نام (Rename) آنها.
برخلاف دستور کپی که حجم اشغالشده روی دیسک را دو برابر میکند، دستور `mv` (زمانی که مبدا و مقصد روی یک پارتیشن یا فایلسیستم یکسان باشند) صرفاً اشارهگر فایل را در جدول فایلسیستم تغییر میدهد؛ بنابراین حتی انتقال یک فایل ۱۰۰ گیگابایتی در همان پارتیشن، آنی و در کسری از ثانیه انجام میشود.
ساختار کلی دستور به این صورت است:
mv [options] source destination
۱. تغییر نام فایل یا پوشه
اگر مبدا و مقصد در یک مسیر باشند، دستور `mv` نام فایل یا پوشه را تغییر میدهد:
mv old_report.txt final_report.txt
۲. انتقال فایل یا پوشه به مسیری دیگر
برای انتقال یک فایل به پوشه دیگر، نام فایل و سپس مسیر مقصد را وارد کنید:
mv database.sql /home/user/backups/
نکته مهم: برخلاف دستور `cp`، دستور `mv` برای انتقال پوشهها نیازی به سوئیچ `-r` ندارد و به صورت پیشفرض پوشهها را با تمام محتویاتشان جابهجا میکند:
mv /tmp/extracted_files /var/www/app
۳. سوئیچهای کاربردی در دستور `mv`
دقیقاً مشابه دستور `cp`، در اینجا نیز سوئیچهای ایمنی وجود دارند تا از حذف ناخواسته فایلهای مقصد جلوگیری شود:
| سوئیچ | نام کامل | توضیحات کاربردی |
|---|---|---|
| -i | Interactive | پیش از جایگزینی فایلهای همنام در مقصد، از شما تأیید میگیرد (جلوگیری از حذف تصادفی). |
| -n | No Clobber | از بازنویسی فایلهای موجود در مقصد بهطور کامل جلوگیری میکند. |
| -b | Backup | در صورت وجود فایل همنام، پیش از جایگزینی یک نسخه پشتیبان از فایل قدیمی تهیه میکند. |
| -v | Verbose | نمایش جزئیات و گزارش مراحل انتقال فایلها در ترمینال. |
| -u | Update | فقط در صورتی فایل را منتقل میکند که فایل مبدا جدیدتر از فایل مقصد باشد یا در مقصد وجود نداشته باشد. |
mv -iv *.log /var/log/archived_logs/
انتخاب هوشمندانه فایلها با Wildcards (علائم جایگزین)
هنگام کار با دستورات `cp` و `mv`، استفاده از الگوها (Wildcards) سرعت کار شما را چندین برابر میکند:
۱. **علامت ستاره (`*`):** نماینده صفر یا چند کاراکتر است.
مثال: انتقال تمام فایلهای تصویری با پسوند `.jpg` به پوشه تصاویر:
mv *.jpg ~/Pictures/
۲. **علامت سوال (`?`):** نماینده دقیقاً یک کاراکتر است.
* مثال: کپی کردن فایلهایی مثل `file1.txt` و `file2.txt` (اما نه `file10.txt`):
cp file?.txt /backup/
۳. **آکولاد (`{}` – Brace Expansion):** برای اجرای دستور روی چندین الگوی مشخص بدون تکرار مسیر.
* مثال: کپی کردن تمام فایلهای `.jpg` و `.png` و `.gif` در یک خط فرمان:
cp *.{jpg,png,gif} /var/www/images/
شاهکار مدیریت فایل در لینوکس؛ دستور rsync
وقتی صحبت از کپی کردن حجم بالایی از اطلاعات، تهیه نسخه پشتیبان یا انتقال فایل بین دو سرور میشود، دستورات سنتی cp و scp کم میآورند. در این شرایط، rsync (مخفف Remote Sync) بهترین ابزار موجود در دنیای لینوکس است.
چرا `rsync` برتر است؟
۱. الگوریتم انتقال تفاضلی (Delta Transfer): دستور `rsync` فقط بخشهایی از فایلها را کپی میکند که تغییر کردهاند. اگر یک پوشه ۵۰ گیگابایتی را یکبار کپی کنید و فردا فقط ۲ مگابایت از آن تغییر کند، در اجرای مجدد `rsync` فقط همان ۲ مگابایت منتقل میشود.
۲. قابلیت ادامه انتقال (Resume): اگر در حین کپی شدن یک فایل بزرگ، ارتباط شبکه قطع شود یا سرور ریاستارت شود، با استفاده از سوئیچ مناسب میتوانید انتقال را دقیقاً از جایی که قطع شده ادامه دهید.
۳. نمایش نوار پیشرفت (Progress Bar): بر خلاف `cp` که در هنگام کپی کردن فایلهای حجیم هیچ اطلاعاتی از درصد پیشرفت نشان نمیدهد، `rsync` سرعت انتقال و درصد باقیمانده را دقیق نمایش میدهد.
۱. استفاده از `rsync` برای کپی محلی (جایگزین حرفهای `cp`)
| سوئیچ | نام کامل | توضیحات و مزایا |
|---|---|---|
| -a | Archive | حفظ کامل ساختار فایلها (دسترسیها، زمان تغییر، مالکیت) و کپی بازگشتی (Recursive) پوشهها. |
| -v | Verbose | نمایش جزئیات و لیست فایلهای در حال انتقال؛ برای اطلاع دقیق از وضعیت عملیات. |
| -P | Progress & Partial | نمایش نوار پیشرفت و امکان ادامه انتقال (Resume) فایلهای بزرگ در صورت قطعی. |
| –delete | Delete | حذف فایلهایی در مقصد که در مبدا وجود ندارند (ایجاد یک نسخه آینهای دقیق). |
| –exclude | Exclude | نادیده گرفتن فایلها یا پوشههای خاص (مثلاً node_modules) برای سرعت بالاتر. |
rsync -avP /var/www/html/ /mnt/backup/html/
یک نکته بسیار حیاتی درباره اسلش (`/`) انتهایی در rsync:
اگر در انتهای مسیر مبدا `/` بگذارید (`/var/www/html/`)، محتویات داخل پوشه به مقصد کپی میشود.
اگر `/` نگذارید (`/var/www/html`)، خودِ پوشه به همراه محتویاتش در داخل پوشه مقصد کپی میشود.
انتقال فایل بین دو سیستم در شبکه (Remote File Transfer)
در مدیریت سرورهای لینوکس، بسیار پیش میآید که بخواهید فایلی را از کامپیوتر شخصی خود به سرور مجازی (VPS) بفرستید یا بین دو سرور مختلف فایل جابهجا کنید. برای این کار دو ابزار استاندارد مبتنی بر پروتکل امن SSH وجود دارد.
۱. انتقال فایل در شبکه با دستور `scp` (Secure Copy)
دستور scp بسیار شبیه به دستور cp عمل میکند، با این تفاوت که فایلها را از طریق تونل رمزنگاریشده SSH بین دو سیستم منتقل میکند.
ارسال فایل از سیستم محلی به سرور راه دور:
scp backup.tar.gz root@192.168.1.50:/var/backups/
دریافت (دانلود) فایل از سرور راه دور به سیستم محلی:
scp root@192.168.1.50:/var/log/syslog ~/Desktop/
کپی کردن یک دایرکتوری کامل در شبکه (با سوئیچ `-r`):
scp -r ./my_website user@example.com:/var/www/
استفاده از پورت غیرپیشفرض SSH (با سوئیچ `-P` بزرگ):
اگر پورت SSH سرور شما به دلایل امنیتی از ۲۲ به پورت دیگری (مثلاً ۲۲۲۲) تغییر کرده است، حتماً باید از `-P` (حرف بزرگ) استفاده کنید:
scp -P 2222 database.sql user@192.168.1.50:/home/user/
۲. انتقال فایل در شبکه با `rsync` (روش پیشنهادی برای فایلهای حجیم)
اگر حجم فایلهای شما بالاست یا تعداد فایلها بسیار زیاد است، به جای `scp` از `rsync` روی بستر SSH استفاده کنید. در اینجا با اضافه کردن سوئیچ `-z`، دادهها حین انتقال فشرده (Compress) میشوند تا سرعت انتقال در شبکه افزایش یابد:
rsync -avzP /local/dir/ user@remote_host:/remote/dir/
و اگر پورت SSH سرور تغییر کرده است، با سوئیچ `-e` پورت را مشخص کنید:
rsync -avzP -e 'ssh -p 2222' /local/dir/ user@remote_host:/remote/dir/
جدول مقایسهای: کدام دستور را کجا استفاده کنیم؟
برای اینکه در یک نگاه بتوانید بهترین ابزار را متناسب با نیاز خود انتخاب کنید، جدول زیر را بررسی کنید:
| دستور | کاربرد اصلی | مزایا | معایب و محدودیتها |
|---|---|---|---|
| cp | کپی فایل و پوشه در سیستم محلی | ساده و سریع برای فایلهای کوچک و متوسط؛ به صورت پیشفرض روی تمام توزیعها نصب است. | عدم نمایش نوار پیشرفت، نداشتن قابلیت Resume، و کندی در همگامسازی مجدد فایلهای تغییریافته. |
| mv | جابهجایی و تغییر نام در سیستم محلی | انتقال آنی در یک پارتیشن، عدم اشغال فضای دیسک اضافه، بینیاز از سوئیچ بازگشتی (-r) برای پوشهها. |
در صورت قطع ناگهانی انتقال بین دو دیسک یا پارتیشن مجزا، مدیریت فایلهای ناقص دشوارتر است. |
| scp | کپی سریع فایلها بین دو سیستم از طریق شبکه | سینتکس بسیار آشنا و مشابه دستور cp، امنیت بالا بر بستر رمزنگاریشده SSH. |
در صورت قطع ارتباط شبکه انتقال باید از صفر شروع شود؛ برای دایرکتوریهای پرحجم کندتر از rsync است. |
| rsync | بکاپگیری، سینک و انتقال فایلهای حجیم (محلی و شبکه) | انتقال تفاضلی (فقط بخشهای تغییرکرده)، امکان ادامه انتقال (Resume)، فشردهسازی دیتا و نمایش پیشرفت. | سینتکس کمی پیچیدهتر، حساسیت بالا به اسلش انتهایی (/)، نیاز به نصب بودن در هر دو سرور مبدا و مقصد. |
نکات طلایی و خطاهای رایج که باید بدانید:
۱. خطای `Permission denied`: اگر هنگام کپی یا انتقال فایل با این خطا روبرو شدید، به این معنی است که کاربر فعلی شما مجوز خواندن فایل مبدا یا مجوز نوشتن در پوشه مقصد را ندارد. برای مسیرهای سیستمی، از دستور `sudo` در ابتدای خط فرمان استفاده کنید.
۲. مدیریت فاصله (Space) در نام فایلها: در ترمینال لینوکس، فاصله به معنای جداکننده آرگومانهاست. اگر نام فایل یا پوشه شما دارای فاصله است (مثلاً `my file.txt`)، به یکی از دو روش زیر عمل کنید:
* قرار دادن مسیر داخل علامت نقلقول: `cp “my file.txt” /backup/`
* استفاده از بکاسلش قبل از فاصله: `cp my\ file.txt /backup/`
۳. بررسی فضای خالی مقصد قبل از انتقال: پیش از کپی کردن فایلهای چند ده گیگابایتی، همیشه با دستور `df -h` فضای خالی پارتیشن مقصد را بررسی کنید و با دستور `du -sh folder_name` حجم دقیق پوشه مبدا را به دست آورید تا دیسک سرور در میانه کار پر نشود.
۴. استفاده از `tmux` یا `screen` در انتقالهای طولانی: اگر از طریق SSH به سروری متصل شدهاید و قصد دارید صدها گیگابایت اطلاعات را کپی یا جابهجا کنید، حتماً دستور را داخل یک نشست `tmux` یا `screen` اجرا کنید تا در صورت قطع شدن اینترنت شما، فرآیند کپی در پسزمینه سرور متوقف نشود.
درصورت تمایل به تهیه سرور مجازی لینوکس ایران این لینک را کلیک کنید.
جمعبندی
تسلط بر دستورات انتقال و کپی فایل در لینوکس، مرز بین یک کاربر عادی و یک کاربر حرفهای را مشخص میکند. برای کارهای روزمره و سریع روی سیستم، دستورات `cp` و `mv` به همراه سوئیچهای ایمنی مثل `-i` و `-v` تمام نیازهای شما را برطرف میکنند. اما زمانی که پا به دنیای مدیریت سرور، تهیه نسخههای پشتیبان و جابهجایی دادههای حجیم در شبکه میگذارید، ترکیب قدرتمند `rsync` به همراه پروتکل SSH، سرعت، امنیت و پایداری بینظیری را در اختیارتان قرار میدهد.
ثبت رای