Поиск файлов с минимальной длиной имени файла

Одиночные кавычки включают значение, которое должно быть принято буквально: все типы расширений подавляются. Обычно используется, если значение включает или может включать в себя пробел (пробел, табуляцию, новую строку) или специальные символы ($, \, `), которые пользователь не хочет развернуть или обработать оболочка.

Двойные кавычки включают значение, которое будет иметь переменные, и замену символов. Требуется, когда вывод может содержать пробелы и должен быть назначен как одно значение.

Обратные кавычки заключают в себе команду, результаты которой требуются как значение. Новые оболочки позволяют использовать $(...) вместо `...`. Я предпочитаю новый метод.

Следующий код может помочь понять, что происходит.

CMD='ls .' echo sq: $CMD set $CMD echo raw 1: $1 echo raw: $* set "$CMD" echo dq: $1 echo bq: `$CMD` echo new: $($CMD)
1
задан 19 October 2013 в 22:44

8 ответов

Я думаю, что самый простой способ - использовать:

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

, где число ? символов равно n. Просто потому, что трудно забыть

Но самый хороший способ заключается в использовании опции -regex, чтобы найти имена файлов с n или больше символов. :

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

где n должно быть натуральным числом (минимальная длина имени файла).

См. man find больше о.

6
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Подход 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 __name__ == '__main__' : main()

Использование прост:

./find_files_len.py /path/to/top_directory/  minimal_length

Например:

./find_files_len.py /etc  5 

Это даст нам все файлы с базовым именем не менее 5 символов, найденным рекурсивно через /etc/ и все его подкаталоги. Обратите внимание, что полный путь к файлу будет напечатан в командной строке

0
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Вы можете перебрать список файлов, возвращаемых функцией 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, а regex соответствия. Поместите это определение функции в файл ~/.bashrc, чтобы команда min_fname сохранялась между входами.

0
ответ дан 24 May 2018 в 16:33

Другие вопросы по тегам:

Похожие вопросы: