4

選択したディレクトリ内のすべてのドットファイル (ディレクトリなし) をフィルタリングする bash 関数を作成しようとしています。フルパスではなく、ファイル名のみが必要です。

現時点では、次のコマンドしかありません。

find . -maxdepth 1 -type f -print0

ディレクトリを除くすべてのファイルを出力します。今でも非ドットファイルを除外する必要があります。だから私は次のように出力をgrepにパイプしようとしました:

find . -maxdepth 1 -type f -print0 | grep "^\."

そしてそれはうまくいかないようでした。->

Binary file (standard input) matches

これに対するエレガントな解決策はありますか?

ありがとう!

4

3 に答える 3

5

ドットファイルのみが必要な場合:

find . -maxdepth 1 -type f -name '.*' -printf '%f\0'

テストでは、-name '.*'ドット ファイルが選択されます。-nameグロブを受け入れるため.、文字通りのピリオドを*意味し、任意の文字の任意の数を意味します。

このアクション-printf '%f\0'は、パスなしで NUL 区切りのファイル名を出力します。

名前の選択基準がより複雑になる場合、find は-regex正規表現に基づいてファイルを選択するオファーも提供します。GNU find は、正規表現のいくつかの異なる方言を理解します。で選択できます-regextype。サポートされている方言には、(emacsデフォルト) posix-awk、、、、およびが含まれます。posix-basicposix-egrepposix-extended

Mac OSX またはその他の BSD システム

BSDfindは提供していません-printf。その代わりに、これを試してください:

find . -maxdepth 1 -type f -name '.*' -exec basename {} \;

これは、空白、タブ、または改行などの難しい文字を含むものであっても、すべてのファイル名に安全であることに注意してください。

ドット ファイルを bash 配列に配置する

すべてのドット ファイルとディレクトリを配列に取得する場合は、次のように簡単です。

all=(.*).

これは、すべてのファイル名に対して安全です。

ディレクトリではなく、通常のファイルのみを取得する場合は、bash を使用します。

a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )

これは、すべてのファイル名に対しても安全です。

于 2015-07-19T02:15:53.383 に答える
1

bash グロビング/パターン マッチングを使用することもできます。

for f in .[^.]*; do
    [ -f "$f" ] && echo "$f"
done

[^.].(現在の作業ディレクトリ) または..(親ディレクトリ)の一致を避けるための否定式です。

于 2015-07-19T04:49:09.330 に答える
1

フルパスですべての隠しファイルを取得する

find . -type f -name '.*'

隠しファイルのファイル名だけを取得します。

for f in `find . -type f -name '.*'`; do basename "$f"; done

ただし、ファイル名には空白 (空白、タブ、改行) を含めることができるため、次を使用する方が安全です。

find . -type f -name '.*' -print0 | while IFS= read -r -d '' f; do basename "$f"; done
于 2015-07-19T02:22:27.547 に答える