私は1つのキーバインディングで必要なすべてのファイルを取得するのが大好きです。現在、私はfzfにパイプする3つのfindコマンドを含むシェルスクリプトを持っています。しかし、いくつかの理由でこれを単一のコマンドにまとめる必要があります(特に現在のアプローチは不良であり、欠陥が確実であるため)。
find ~ \! \( -path */.git/* \) -type d
find ~ \( -iname \*.Rmd -o -iname \*.el \) -a \! \( -iname index.txt -o -path */.thunderbird/* -o -path */python3.8/* -o -path */.git/* \) -type f
find ~ -regextype posix-extended \( -not -regex ".*/\.sw(o|p)" -a -not -regex ".*\~$" \) -maxdepth 1 -type f
誰もが私の醜いfindコマンドを批判し、ファイル拡張子をホワイトリスト/ブラックリストに追加するより効率的でクリーンな方法を提案したいと思います。
編集する コマンドが何をしているのかを理解しやすくするために、コマンドを簡素化しました。
- 最初のコマンドはホームパスの下にディレクトリを探しますが、そのディレクトリとそのサブディレクトリは
~
除外します。.git
- 2 番目のコマンドは、ホームディレクトリでファイルを検索し、ホワイトリストファイル拡張子を指定してから、ブラックリストファイル拡張子とパスを指定します。
- 3番目は私のホームディレクトリでドットファイルを探しますが、特定の正規
~
表現は除外します。
ベストアンサー1
おそらく:
LC_ALL=C find ~/. \
'(' \
-name .git -o \
-name .thunderbird -o \
-name python3.8 \
')' -prune -o \
'(' \
-type d -o \
'(' \
-name '*.[rR][mM][dD]' -o \
-name '*.[eE][lL]' -o \
! -path '*/./*/*' \
! -name '.sw[op]' \
! -name '*~' \
')' \
-type f \
')' -print
(ここでは標準構文が使用されます(すべてGNUfind
拡張-regex
、、、、、を除く)。-regex-type
-iname
-maxdepth
-not
-maxdepth
-prune
//すべてのディレクトリは.git
完全にスキップされ、同時には表示されません。これは、まだ印刷し、その中にあるディレクトリとディレクトリを探す最初のコマンドと比較すると異なります。.thunderbird
python3.8
find
find
.thunderbird
python3.8
-maxdepth 1
深さ1(3番目のコマンドと同様)でファイルを報告できるように/.
検索ディレクトリに追加し、一致するパス*/./*/*
(2つ以上のレベル以下/./
)を持つファイルを除外します。ただし、これはパスがとして印刷されることを意味します/home/you/./file.txt
。これが気に入らない場合は、/./
いつでも出力をパイピングして削除できます| sed 's|/\./||;1s|/\.$//'
。
あなたのコンテンツはとにかく一致しないため、! -iname index.txt
重複します。また、シェルが引用符を拡張できるという事実も忘れています。index.txt
-iname \*.Rmd -o -iname \*.el
*/.git/*
改行文字を含むファイルパスでも機能するように-print
with-print0
とusingに置き換えることもできます。fzf --read0