欲しい探すGNU以外の環境の一部のファイル
- 現在のディレクトリのみ
- 拡張機能付き*.ext1そして*.ext2、
- しかし、名前1.*または名前2.*
次のコマンドは機能しますが、シェルは拡張されてい./*
ます探す広範なファイルとディレクトリのリストを得ることができます。
find ./* -prune \( -name '*ext1' -o -name '*ext2' \) -a ! \( -name 'name1*' -o -name 'name2*' \)
修正する:
私はAIXで働いています。-最大深さオプション。
答え1
そしてfind
:
find . ! -name . -prune \
\( -name '*.ext1' -o -name '*.ext2' \) \
! \( -name 'name1.*' -o -name 'name2.*' \)
usingは-prune
GNU標準と同じです-maxdepth
。ここでは、 をfind
除くどのディレクトリにも入らないように指示します.
。
! -name .
GNU標準と同様に、選択から除外されます。 GNUの場合。.
! -name . -prune
-mindepth 1 -maxdepth 1
-mindepth 1
find . \( -name . -o -prune \)
を使用すると、zsh
次のこともできます。
set -o extendedglob
print -rC1 -- *.(ext1|ext2)~(name1|name2).*(ND)
~
AND NOT演算子であり、(D)
ドットファイルを含みます。
答え2
現在のディレクトリでls
withを使用できますgrep
(ファイル名に改行文字が含まれていないとします)。
ls -a | grep -E '\.ext(1|2)$' | grep -vE '^name(1|2)\.'
答え3
「現在のディレクトリのみ」ファイルを必要とせずに簡単に一覧find
表示できます(面白い文字を含む奇妙なファイル名が発生する可能性に関する一般的な注意)。
ls -d *.ext1 *.ext2 2>/dev/null | grep -v '^\(name1\|name2\)\.'
答え4
これでbashを使用できるので、次のものを使用できます。拡張パターンマッチング:
shopt -s extglob
files=( !(name1|name2).@(ext1|ext2) )
これは、現在のディレクトリ内のすべてのファイルを意味します。いいえ「name1」または「name2」で始まり、ピリオドが続きます。誰でも「ext1」または「ext2」。
たとえば、次のようにします。
$ touch name1.ext1 name1.ext2 name2.ext1 name2.ext2 name3.ext1 name3.ext2 name3.ext3
$ files=( !(name1|name2).@(ext1|ext2) )
$ declare -p files
declare -a files='([0]="name3.ext1" [1]="name3.ext2")'
「name3.ext2」などの単純なファイル名がある場合は、パターン一致ピリオドを配置する場所(「name3」の1つ)を選択する必要があります。または「.ext2」から「name3.intermediate.ext2」などのファイル名が長い場合は、途中でドットとグローバル記号を使用できます。
$ files=( !(name1|name2).*.@(ext1|ext2) )