オプションでファイルリストに戻る

オプションでファイルリストに戻る

コンテキスト:OSX Catalina(zSh)とUbuntu 16.04(Bash)。 OSXターミナルコマンド:

FILES="$PWD/*"  #list of files
echo $FILES

すべてのファイルの文字列をコンソールに返します。現在は、処理したいディレクトリにスクリプトのコピーを植える予定です。将来的には、スクリプトが処理するパラメータ(ディレクトリ)を受け入れることができるようにしたいと思います。

ファイル形式が作業ディレクトリ(隠しファイルではなく拡張子)にあるとします。

  • .アルファベット
  • .アルファベット
  • .def
  • .ghi
  • .jkl

上記のガイドラインの修正例に興味があります。

  1. .abc、.ABC、および.defファイル形式(拡張子)のみを明示的に選択します。
  2. すべてのファイルを選択とは別に.shと.jkl

理想的には、大文字と小文字を区別しないコマンドオプションがあります。

答え1

Bashの配列を使用してこれを簡単に行うことができます(これはUbuntuのデフォルトシェルであり、最新バージョンのmacOSはbashまたはzshです。これらのソリューションはbashに関連しています)。

  1. すべてのファイルを選択します(元のコマンド、少し変更されました)。

     $ shopt -s nullglob
     $ files=(*)
     $ echo "${files[@]}"
     file.abc file.ABC file.def file.ghi file.jkl file.sh
    

    nullglobディレクトリが空の場合、このオプションをオンにすると空のリストが表示されます。このオプションがないと、ディレクトリが空の場合はfiles拡張されていない要素のリストが表示されます*

  2. .abc.ABC名前またはorで終わるファイルのみを選択してください.def

    $ shopt -s nullglob
    $ files=(*.abc *.ABC *.def)
    $ echo "${files[@]}"
    file.abc file.ABC file.def
    
  3. .sh名前で終わるファイル以外のすべてのファイルを選択してください。.jkl

    $ shopt -s extglob nullglob
    $ files=(!(*.sh|*.jkl))
    $ echo "${files[@]}"
    file.abc file.ABC file.def file.ghi
    
    
  4. 大文字と小文字を区別しない一致

    $ shopt -s nocaseglob nullglob
    $ files=(*abc)
    $ echo "${files[@]}"
    file.abc file.ABC
    

また、あなたがしていることを知っておいてください。files="$PWD/*"値は$files現在のディレクトリ内のすべてのファイルに設定されていません。その値は、次に終わる文字列に設定されます/*

$ cd /tmp/current_directory
$ files="$PWD/*" 
$ echo "$files"
/tmp/current_directory/*

うまくいくと思うのは、引用符なしで使用するためですecho $files。これはシェルが拡張されていることを意味します/tmp/current_directory/*。ただし、後でこれらのファイルを削除すると、同じechoコマンドが元のコマンドを実行したディレクトリに印刷され、/tmp/current_directory/*拡張されます。$PWDファイルリストは変数とともに保存されません。このように配列を使用すると、変数が使用場所によって異なる値に拡張される可能性のあるglobだけでなく、実際のファイルのリストも保存されます。

答え2

存在するzsh

files=($PWD/*.(abc|ABC|DEF)(N))
print -rC1 -- $files # print raw, on one column.

(エラーを報告するのではなく、空のパターンリストがファイルと一致しないようにglobに適用された修飾子を(N)使用してください。)nullglob$files

.shと以外のファイルの場合.jkl

set -o extendedglob # needed for the ^ negation operator
files=($PWD/^*.(sh|jkl)(N))

.ABC大文字と小文字を区別しない一致(/ .abc/ .Abc...)の場合:

set -o extendedglob
files=($PWD/*.(#i)abc(N))

あなたの:

FILES="$PWD/*"
echo $FILES

複数のアカウントが間違っています。

FILES="$PWD/*"ファイルリストを$FILE変数に保存しないでください。これは単一の値のみを保存できるスカラー割り当てです。代わりに、$FILES文字通りの意味が次の内容に保存されます。$PWD/*

引用されecho $FILESていないように(ただし)の拡張は分割+globの影響を受けます。その後、文字が含まれていないとします。$FILESbashzsh$FILES$FILES$IFS分けるセクション)、$PWDワイルドカード(globセクションもトリガー)を含まない場合、値は一致するファイルのリストに展開されます。

Split + globでは、zshパラメータ拡張は暗黙的に実行されず、明示的に要求する必要があります($=FILES分割の場合、$~FILESワイルドカードの場合、$=~FILES両方の場合)。

ではecho、 を使って任意のデータを出力するのもエラーであり、echo基本的に追加処理をするのもエラーです(または をzsh使用できる)。echo -E - $filesprint -r -- $files

関連情報