پیشنهادی فروشگاه فایل کارینت
تکنولوژی

نحوه برخورد با فضاهای موجود در نام فایل ها در لینوکس

Linux laptop showing a bash prompt
Fatmawati achmad zaenuri/Shutterstock.com

اگر نام فایلی با فاصله در یک سیستم لینوکس دارید، قرار دادن نام فایل خود در گیومه به Bash اجازه می دهد آن را به درستی انجام دهد. تکمیل تب، وارد کردن نام فایل‌ها در خط فرمان را آسان می‌کند، حتی اگر دارای فاصله باشند.

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

نام فایل فروتن

هر چیزی که در هارد دیسک رایانه شما ذخیره شده است، باید نام داشته باشد. بدون نام، هیچ فایلی وجود نخواهد داشت. همه برنامه‌ها و دیمون‌هایی که هنگام بوت شدن رایانه شما راه‌اندازی می‌شوند و همه نرم‌افزارهایی که استفاده می‌کنید، باید شناسایی و در یک سیستم فایل ذخیره شوند. این شناسه نام فایل است.’

همین مورد در مورد فایل هایی که ایجاد یا نصب می کنید نیز صدق می کند. همه اسناد، تصاویر و موسیقی شما به نام فایل نیاز دارند. بدون نام فایل، هیچ یک از دارایی های دیجیتال شما نمی تواند وجود داشته باشد. از آنجایی که نام فایل‌ها بسیار مهم هستند، لینوکس تلاش می‌کند تا آنجا که می‌تواند قوانین کمی را در مورد ترکیب آنها اعمال کند.

در لینوکس، نام فایل ممکن است شامل هر کاراکتری به غیر از اسلش رو به جلو “/” و نویسه تهی، 0x00 باشد. کاراکتر null برای علامت گذاری انتهای یک رشته استفاده می شود، بنابراین نمی تواند در خود رشته وجود داشته باشد، یا لینوکس نام فایل را در موقعیت نویسه تهی کوتاه می کند. اسلش رو به جلو “/” به عنوان جداکننده در مسیرهای فهرست استفاده می شود.

نام فایل‌ها به حروف کوچک و بزرگ حساس هستند، و می‌توانند حداکثر 255 بایت باشند، از جمله کاراکتر تهی. مسیرهای دایرکتوری می توانند تا 4096 بایت طول داشته باشند، از جمله کاراکتر تهی. توجه داشته باشید که این طول آنها بر حسب بایت است که ممکن است مستقیماً با نویسه‌ها برابر نباشد. برای مثال، کاراکترهای یونیکد 16 بیتی، هر کدام دو بایت می گیرند.

علاقه‌مندان به محاسبات قدیمی و کسانی که حافظه طولانی دارند می‌دانند که در روزهای اولیه رایانه‌های شخصی، سیستم عامل دیسک مایکروسافت، DOS، به حروف بزرگ و کوچک حساس نبود و دارای محدودیت نام فایل هشت نویسه، به علاوه یک افزونه.

وقتی فایل‌ها را نام‌گذاری می‌کنید باید بسیار متفکر و گاهی خلاق باشید. در مقام مقایسه، آزادی ما امروز به این معنی است که می‌توانیم فایل‌ها را هر چه که می‌خواهیم نامگذاری کنیم، بدون توجه به چیزی غیر از توضیحاتی که برای آن فایل ایجاد می‌کنیم.

اما در مورد نام فایل‌ها، چیزی که اغلب ما را به خود مشغول می‌کند نویسه‌هایی نیست که تایپ می‌کنیم، بلکه فاصله‌های بین آنهاست.

چرا فضاها در نام فایل‌های لینوکس دردسرساز هستند

پوسته‌هایی مانند Bash رشته‌ای از کلمات جدا شده با فاصله را به عنوان آرگومان‌های فرمان جداگانه تفسیر می‌کنند، نه یک آرگومان واحد. در اینجا یک مثال آورده شده است، با استفاده از touch برای یک فایل جدید ایجاد کنید به نام my new file.txt.

file.txt جدید من را لمس کنید
ls

Trying to use touch to create a file with spaces in its name

همانطور که می بینیم، ls به ما نشان می دهد که سه فایل ایجاد شده است، یکی به نام “my”، دیگری به نام “new” و دیگری به نام “file.txt”.

>

توجه داشته باشید که touch شکایت نکرد یا خطایی ایجاد نکرد. آنچه را که فکر می کند ما از او می خواهیم انجام می دهد. بنابراین بی‌صدا ما را به خط فرمان برمی‌گرداند. اگر انگیزه بررسی نداشته باشیم، نمی دانیم که همه چیز طبق برنامه پیش نرفته است.

برای ایجاد فایلی که می‌خواهیم، ​​باید نقل قول یا فرار کنیم.

نحوه نقل قول و فرار از فضاها

اگر کل نام فایل را نقل قول کنیم، touch می داند که باید متن نقل قول شده را به عنوان یک آرگومان واحد در نظر بگیرد.

"file.txt جدید من"

را لمس کنید

ls

Using touch to create file with spaces in its name, with the whole filename enclosed in quotes

این بار تنها فایلی را که انتظار داریم دریافت می کنیم.

اگر از کاراکتر بک اسلش “” برای فرار از فاصله ها استفاده کنیم، می توانیم همان نتیجه را دریافت کنیم. با «فرار» از فضاها به عنوان شخصیت‌های خاص در نظر گرفته نمی‌شوند – یعنی جداکننده‌های استدلال – آنها به عنوان فضاهای قدیمی ساده در نظر گرفته می‌شوند.

my second new file.txt

را لمس کنید

ls

Using touch to a create a file with spaces in its name escaped with backslashes

این کار می کند، اما فرار از فضاها تایپ نام فایل ها را کندتر و مستعد خطا می کند. اگر نام دایرکتوری هایی با فاصله در آنها نیز وجود داشته باشد، ممکن است واقعاً زشت شود.

cp dir one/my text file.txt dir two/my text file.bak
ls

Using escaped spaces in a command to copy a file from one directory to another

این دستور یک فایل متنی واحد را از دایرکتوری به نام “dir one” در فهرستی به نام “dir two” کپی می کند و کپی را به عنوان یک فایل BAK ذخیره می کند. و این یک مثال نسبتاً ساده است.

چگونه مشکل فضا را در منبع آن برطرف کنیم

اگر فایل‌های خود شما هستند، می‌توانید تصمیم بگیرید که هرگز از فاصله‌ها استفاده نکنید و ایجاد کنید (یا تغییر نام انبوه) نام فایل ها مانند این است.

mynewtextfile.txt

مسلماً، این یک راه حل قوی است اما هنوز هم زشت است. گزینه های بهتری وجود دارد، مانند استفاده از خط تیره “-” یا زیرخط “_” برای جدا کردن کلمات خود.

my-new-text-file.txt
my_new_text_file.txt

هر دوی اینها مشکل را کنار می‌گذارند و قابل خواندن هستند. اگر نمی‌خواهید نویسه‌های اضافی به نام فایل‌های خود اضافه کنید، می‌توانید از CamelCase برای خواندن نام فایل‌های خود استفاده کنید، مانند این :

MyNewTextFile.txt

بسط برگه کار با فضاها را آسان می کند

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

می‌توانید از گسترش برگه استفاده کنید تا به شما کمک کند تا نام فایل‌ها را با دقت «پر کردن» برای ما انجام دهید. فرض کنید می‌خواهیم حذف کنیم فایل BAK را در “dir two” با استفاده از rm ایجاد کردیم.

ما با تایپ “rm dir” شروع می کنیم زیرا از دستور rm استفاده می کنیم و می دانیم که نام دایرکتوری با “dir” شروع می شود.

rm dir

Typing the start of a command, before pressing tab to use tab completion

فشردن کلید “Tab” باعث می‌شود Bash برای یافتن موارد منطبق در فهرست فعلی جستجو کند.

Pressing tab has added a backslash and a space to the partial directory path

دو دایرکتوری وجود دارد که با “dir” شروع می‌شوند، و در هر دو مورد، کاراکتر بعدی یک فاصله است. بنابراین Bash کاراکتر بک اسلش “” و یک فاصله اضافه می کند. Bash سپس منتظر می ماند تا شخصیت بعدی را ارائه دهیم. برای تمایز بین دو مطابقت احتمالی در این فهرست، به کاراکتر بعدی نیاز دارد.

یک “t” را برای “two” تایپ می کنیم و سپس یک بار دیگر “Tab” را فشار می دهیم.

The directory path after typing "t" and pressing tab

Bash نام دایرکتوری را برای ما تکمیل می کند و منتظر می ماند تا شروع نام فایل را تایپ کنیم.

ما فقط یک فایل در این دایرکتوری داریم، بنابراین تایپ حرف اول نام فایل، “m” کافی است تا Bash بداند که از کدام فایل می خواهیم استفاده کنیم. تایپ کردن “m” و فشار دادن “Tab” نام فایل را برای ما تکمیل می کند و “Enter” کل دستور را اجرا می کند.

The entire filename completed by pressing "m" and pressing Tab.

بسط برگه اطمینان از دریافت صحیح نام فایل‌ها را آسان می‌کند و همچنین به طور کلی سرعت پیمایش و تایپ در خط فرمان را افزایش می‌دهد.

مرتبط: استفاده از Tab Completion برای تایپ سریعتر دستورات در هر سیستم عامل

نحوه استفاده از نام فایل ها با فاصله در اسکریپت های Bash

جای تعجب نیست که اسکریپت‌ها دقیقاً همان مشکلاتی را با فاصله در نام فایل‌ها در خط فرمان دارند. میکند. اگر نام فایل را به عنوان متغیر ارسال می کنید، مطمئن شوید که نام متغیر را نقل قول کرده اید.

این اسکریپت کوچک دایرکتوری فعلی را برای فایل هایی که با الگوی فایل “*.txt” مطابقت دارند بررسی می کند و آنها را در متغیری به نام file_list ذخیره می کند. حلقه for برای انجام یک عمل ساده در هر یک استفاده می‌شود. یک.

#!/bin/bash

file_list=*.txt

برای فایل در $file_list
انجام دادن
ls -hl $ file
انجام شد

این متن را در یک ویرایشگر کپی کنید و در فایلی به نام “files.sh” ذخیره کنید. سپس از فرمان chmodاستفاده کنید > برای قابل اجرا کردن.

chmod +x files.sh

Using chmod to make the script executable

ما چند فایل در این فهرست داریم. یکی دارای نام فایل ساده است و دو مورد دیگر به جای فاصله از زیرخط “_” یا خط تیره “-” استفاده می کنند. این همان چیزی است که هنگام اجرای اسکریپت می بینیم.

./files.sh

Running the files.sh script with filenames containing no spaces

به نظر می رسد که به خوبی کار می کند. اما اجازه دهید فایل‌های موجود در فهرست را برای فایل‌هایی که دارای فاصله در نام‌شان هستند، تغییر دهیم.

./files.sh

Running the files.sh script with filenames containing spaces

هر کلمه در هر نام فایل به گونه ای مدیریت می شود که گویی به تنهایی یک نام فایل است و بنابراین اسکریپت از کار می افتد. اما تنها کاری که ما باید انجام دهیم تا اسکریپت در نام فایل ها فاصله داشته باشد این است که متغیر $file را در داخل حلقه for نقل قول کنیم.

#!/bin/bash

file_list=*.txt

برای فایل در $file_list
انجام دادن
ls -hl "$file"
انجام شد

توجه داشته باشید که علامت دلار “$” در داخل مظنه ها قرار دارد. ما آن تغییر را انجام دادیم و آن را در فایل اسکریپت “files.sh” ذخیره کردیم. این بار، نام فایل ها به درستی مدیریت می شوند.

./files.sh

The modified files.sh script correctly handling files with spaces in their filenames

مرتبط: نحوه پردازش خط به خط یک فایل در اسکریپت لینوکس Bash

با فاصله، اما پوسته پوسته نیست

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

منبع

امتیاز بدید
‫0/5 ‫(0 نظر)
مشاهده بیشتر

تحریریه کارینت

مطالب فناوری، آموزشی، ترفند های وب و موبایل و کلی مطلب دیگه رو در وبلاگ کارینت دنبال کنید :) | ما را در تلگرام دنبال کنید (@karynet)

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا