
コンテキスト:OSX Catalina(zSh)とUbuntu 16.04(Bash)。 OSXターミナルコマンド:
FILES="$PWD/*" #list of files
echo $FILES
すべてのファイルの文字列をコンソールに返します。現在は、処理したいディレクトリにスクリプトのコピーを植える予定です。将来的には、スクリプトが処理するパラメータ(ディレクトリ)を受け入れることができるようにしたいと思います。
ファイル形式が作業ディレクトリ(隠しファイルではなく拡張子)にあるとします。
- .アルファベット
- .アルファベット
- .def
- .ghi
- .jkl
- 。
上記のガイドラインの修正例に興味があります。
- .abc、.ABC、および.defファイル形式(拡張子)のみを明示的に選択します。
- すべてのファイルを選択とは別に.shと.jkl
理想的には、大文字と小文字を区別しないコマンドオプションがあります。
答え1
Bashの配列を使用してこれを簡単に行うことができます(これはUbuntuのデフォルトシェルであり、最新バージョンのmacOSはbashまたはzshです。これらのソリューションはbashに関連しています)。
すべてのファイルを選択します(元のコマンド、少し変更されました)。
$ shopt -s nullglob $ files=(*) $ echo "${files[@]}" file.abc file.ABC file.def file.ghi file.jkl file.sh
nullglob
ディレクトリが空の場合、このオプションをオンにすると空のリストが表示されます。このオプションがないと、ディレクトリが空の場合はfiles
拡張されていない要素のリストが表示されます*
。.abc
.ABC
名前またはorで終わるファイルのみを選択してください.def
。$ shopt -s nullglob $ files=(*.abc *.ABC *.def) $ echo "${files[@]}" file.abc file.ABC file.def
.sh
名前で終わるファイル以外のすべてのファイルを選択してください。.jkl
$ shopt -s extglob nullglob $ files=(!(*.sh|*.jkl)) $ echo "${files[@]}" file.abc file.ABC file.def file.ghi
大文字と小文字を区別しない一致
$ 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の影響を受けます。その後、文字が含まれていないとします。$FILES
bash
zsh
$FILES
$FILES
$IFS
分けるセクション)、$PWD
ワイルドカード(globセクションもトリガー)を含まない場合、値は一致するファイルのリストに展開されます。
Split + globでは、zsh
パラメータ拡張は暗黙的に実行されず、明示的に要求する必要があります($=FILES
分割の場合、$~FILES
ワイルドカードの場合、$=~FILES
両方の場合)。
ではecho
、 を使って任意のデータを出力するのもエラーであり、echo
基本的に追加処理をするのもエラーです(または をzsh
使用できる)。echo -E - $files
print -r -- $files