Bashで使用するときは、ファイル名に "?"などの文字を使用しないことをお勧めします。

Bashで使用するときは、ファイル名に "?"などの文字を使用しないことをお勧めします。
  1. たとえば、

    $ ls -l
    total 344
    -r-------- 1 t t 145657 Mar 11 01:53 joeltest-slides.pdf
    -rw-rw-r-- 1 t t 166814 Mar 11 01:55 The Joel Test: 12 Steps to Better Code? by Joel Spolsky.pdf
    drwx-w--w- 2 t t   4096 Sep 19  2012 The Joel Test 12 Steps to Better Code_files
    -rw--w--w- 1 t t  31940 Feb 12  2011 The Joel Test 12 Steps to Better Code.html
    $ mv The\ Joel\ Test\:\ 12\ Steps\ to\ Better\ Code{                                                                                                                 
    \ by\ Joel\ Spolsky.pdf,.pdf}
    mv: missing destination file operand after ‘The Joel Test: 12 Steps to Better Code{’
    Try 'mv --help' for more information.
    

    どういう意味ですかmissing destination file operand? ファイル名のせいですか?

  2. Bashで組み込みまたは外部コマンドを介してファイル操作を実行するときにファイル名を指定するときにどの文字を避けるのが最善ですか?例えば、

    ?上記の例は、それがその1つであることを示唆していますか?

    する私の以前の投稿改行文字がその一つであることを示唆していますか?

    する私の移転 郵便スペースがそのうちの1つであることを示唆していますか?

  3. Linuxの観点から、ファイル名に使用できる文字に制限がないことは正しいですか?ファイルシステムタイプ(ext4)の観点からも同じですか?

答え1

絶対的なルールは、/ファイル名にスラッシュやヌルバイトを使用できないことです。スラッシュはディレクトリ区切り文字なので、エスケープできません。ヌルバイトは名前の終わりを表し、エスケープできません。それ以外の場合、Linuxではすべての文字が許可されますが(他のファイルシステムと共有されているメディアまたはネットワークリソースにアクセスする場合を除く)、複数の文字が問題を引き起こす可能性があります。私の考えでは、すべての最新の* BSDは/NULLバイトを除くすべての文字を受け入れますが、いくつかの古いユニスはより多くの制限を持っています。

ファイル名が引用符なしでユニバーサルシェルで機能するようにするには、!"#$&'()*;<=>?[\]^`{|}~スペース(スペース、タブ、改行)を避ける必要があります。~最後だったら大丈夫だったのに。特にbashでは^大丈夫です。始めを除くすべての場所で問題ありませんが、#コマンド名を除いては問題ありません(割り当てとして解釈されるため)。~=

それに加えて、重要度に基づいてソートされたいくつかのファイル名の移植性提案があります。

  • ファイル名は-(ダッシュ/ハイフン)で始まってはいけません。コマンドはこれをオプションとして解釈できます。
  • ~多くのアプリケーションでは「ホームディレクトリ」を意味するため、イニシャル(チルダ)を使用しないでください。
  • より一般的には、句読点で始まったり終わったりしないことをお勧めします。多くのアプリケーションがこれらのシンボルに特別な意味を割り当てるためです(たとえば、出力の場合でも「ファイルに書き込む」の代わりに「プログラムを介したパイプ」を|foo意味します)。foo|foofoo|
  • Windowsユーザーとファイルを交換したり、リムーバブルメディアにファイルを保存したりする場合は、Windowsでサポートされていない文字を使用しないでください。\/?:*"><|
  • 印刷できない文字(制御文字など)、タブ、改行文字を使用しないでください。多くのインターフェイスでは入力できません。
  • 誤って作成された一部のシェルスクリプトチョーク空間的にそして\*?[]彼らがいるのでワイルドカード。また、複数のファイルで動作する一部のアプリケーションは、これらの文字をワイルドカードとして同時に解釈します。
  • 古いコンピュータや他の言語、特にラテン語以外の言語を使用している人とファイルを交換する場合は、他の文字エンコーディングを使用できます。これASCIIコード文字はどこでも使用でき、同じ方法でエンコードされます。
  • 多くのアプリケーションが使用ファイル拡張子、サポートするファイルとファイルを開く方法を学びます。さらに、システムは拡張子を使用してファイルを開くために使用するアプリケーションを決定します。したがって、拡張をそのまま維持してください。拡張子は最後の点の後の部分です。txtたとえば、圧縮()テキスト()ファイルなど、複数のmyfile.txt拡張子がある場合があります。myfile.txt.gz.gz.txt
  • .で始まるファイル名は次のとおりです。デフォルトでは非表示コマンドの出力lsと多くのファイルブラウザで。
  • Unixは大文字と小文字を区別します。伝統的myfileMyfile、ファイル名は簡単に入力できるので小文字でした。過去には、システムで小文字より大文字の順位を付ける場合が多かったので、ファイル名を大文字で始めてディレクトリリストに先に表示する伝統がありましたが、最新システムでは大文字と小文字を区別せずに名前の順位を付けることが多いです。 。小文字を使用すると複雑にならず、入力が簡単になります。

これらすべての複雑な問題を覚えたくない場合は、次の2つの簡単な規則に従ってください。

  • a最大セキュリティ:文字とz数字0、区切り文字を使用し9てファイル名の末尾に置きます。たとえば、-.extensionmy-file.txt
  • 読みやすいように:ファイル名の末尾に英語の文字と数字または独自のスクリプトを使用し、スペースまたは区切り-文字を追加します。.extensionたとえば、Jörgs Datei.txt

最後のヒント:日付には、YYYYMMDD形式(年 - 月 - 日、4桁の年、前にゼロの付いた月と日の数字)を使用してください20150622-report.txt。これにより、ファイル名を並べ替えると時系列で並べ替えられます。

関連情報