少なくともn
文字(拡張子を含む)のファイル名を持つ特定のフォルダー内のすべてのファイルを検索したいです。 find
でこれを達成する方法はありますか?
-regex
テストでfind
コマンドを使用できます
$ find /path/to/folder -regextype posix-basic -regex '.*/.\{5,\}'
または
$ find /path/to/folder -regextype posix-extended -regex '.*/.{5,}'
-regex
はfile matchではなくpath matchであることに注意してください-したがって、先頭の.*/
も、5文字以上のファイル名の前
別の方法として、純粋なbashソリューションの場合、拡張シェルグロビングを有効にして、パターン「!(@(?|??|???|????))
」を使用して、「1、2、3、 4文字
$ shopt -s extglob
$ ls -d /path/to/folder/!(@(?|??|???|????))
サブディレクトリを含める場合は、globstar
オプションも有効にし、**
ワイルドカードを追加できます。
$ shopt -s extglob globstar
$ ls -d /path/to/folder/**/!(@(?|??|???|????))
例えば
$ ls -d **/!(@(?|??|???|????))
abcde abcdef abcdefg subdir subdir/abcde subdir/abcdef subdir/abcdefg
一方、非反転一致(5文字より短いファイル)は
$ ls -d **/@(?|??|???|????)
a ab abc abcd subdir/a subdir/ab subdir/abc subdir/abcd
後でオプションを設定解除するには、使用します
$ shopt -u extglob globstar
私は最も簡単な方法は使用することだと思います:
find . -name "??????????*"
?
文字の数はn
と同じです。忘れにくいので簡単です。
しかし、最も良い方法は、-regex
オプションを使用して、n
以上の文字を含むファイル名を見つけることです。
find . -regextype posix-egrep -regex ".*[^/]{n}"
n
は自然数(ファイル名の最小の長さ)でなければなりません。
man find
を参照してください。
find
によって返されるファイルのリストをループし、各ファイルのベース名の長さをテストできます。
min_fname() {
for path in $(find "$1" -type f); do
bn="${path##*/}"
if (( "${#bn}" >= $2 )); then
echo "$path"
fi
done
}
# usage: min_fname dir value
$ min_fname /tmp 5
$ min_fname /home/user 10
この関数は、find
およびBash組み込みメカニズムのみを使用し、正規表現の一致は使用しません。この関数定義を~/.bashrc
ファイルに配置して、ログイン間でmin_fname
コマンドを永続化します。
Pythonのアプローチ:
#!/usr/bin/env python
from __future__ import print_function
import os,sys
def main():
treeroot = sys.argv[1]
base_len = int(sys.argv[2])
for dir,subdirs,files in os.walk(treeroot):
for f in files:
if len(f) >= base_len:
fullpath = os.path.abspath(os.path.join(dir,f))
print(fullpath)
if __== '__main__' : main()
使い方は簡単です:
./find_files_len.py /path/to/top_directory/ minimal_length
例えば:
./find_files_len.py /etc 5
これにより、/etc/
およびそのすべてのサブディレクトリを通じて再帰的に検出された、少なくとも5文字のベース名を持つすべてのファイルが提供されます。ファイルのフルパスがコマンドラインに出力されることに注意してください