web-dev-qa-db-ja.com

ファイル名の長さが最小のファイルを検索する

少なくともn文字(拡張子を含む)のファイル名を持つ特定のフォルダー内のすべてのファイルを検索したいです。 findでこれを達成する方法はありますか?

4
gieldops

-regexテストでfindコマンドを使用できます

$ find /path/to/folder -regextype posix-basic -regex '.*/.\{5,\}'

または

$ find /path/to/folder -regextype posix-extended -regex '.*/.{5,}'

-regexfile 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
4
steeldriver

私は最も簡単な方法は使用することだと思います:

find . -name "??????????*"

?文字の数はnと同じです。忘れにくいので簡単です。

しかし、最も良い方法は、-regexオプションを使用して、n以上の文字を含むファイル名を見つけることです。

find . -regextype posix-egrep -regex ".*[^/]{n}"

nは自然数(ファイル名の最小の長さ)でなければなりません。

man findを参照してください。

7
Radu Rădeanu

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コマンドを永続化します。

0
user54813

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文字のベース名を持つすべてのファイルが提供されます。ファイルのフルパスがコマンドラインに出力されることに注意してください

0