Найти файлы, имя которых составляет 4 символа

Я хотел бы найти файлы, чье имя имеет всего 4 символа.

Например, в /tmp есть три файла:

 $ ls /tmp txt file linux 

Вывод должен показывать file только потому, что он имеет только 4 символа.

  • Как использовать globs / wildcards, когда опция -C используется в команде tar?
  • aptitude remove pkg_name * не работает как apt-get
  • Удалить неизвестный символ юникода из textfiles - sed, другие методы bash / shell
  • Ограничение поддержки символов ZSH, поддерживающее повторение?
  • цикл в файле с определенным расширением в сценарии оболочки дочерней папки
  • Удалите несколько последовательных имен файлов, но игнорируйте часть первого
  • «Rm. *» Когда-либо удаляет родительский каталог?
  • Посмотрите, есть ли в папке несколько файлов с определенными расширениями
  • 9 Solutions collect form web for “Найти файлы, имя которых составляет 4 символа”

    Использовать ? подстановочный знак для файлового глобирования:

     ls -d /tmp/???? 

    Это приведет к печати всех файлов и каталогов, чье имя файла длится 4 символа.

    Как было предложено @roaima, флаг -d не позволит ls отображать содержимое подкаталогов, соответствующих шаблону.

    Список файлов только в /tmp :

     cd /tmp find . ! -name . -prune -path './????' -type f 

    Список файлов в /tmp рекурсивно:

     find /tmp -path '*/????' -type f 

    Пытаться:

     find /tmp -type f -print| awk -F/ ' length($NF) == 4 ' 

    Что делает awk :

    • Используя / как разделитель полей,
    • Поиск имени файла $NF (последнее поле)
    • length вычислений
    • И проверьте, если значение равно 4, а затем распечатайте его.

    Мне кажется, что это самый простой способ найти файл из четырех байтов:

     find /tmp -type f -size 4c 

    Изменить: найти имя файла из четырех байтов:

     find /tmp -type f -name '????' 

    Существует также решение perl (5.10 или новее):

     perl -E 'say for </tmp/????>;' 

    Немного более гибкая версия, где вы можете указать желаемую длину:

     perl -E 'my $w = "?" x shift; say for </tmp/$w>;' 4 

    Предполагая, что вы используете bash, вы можете сделать следующее:

     shopt -s globstar shopt -s nullglob filearray=(/tmp/**/????) 

    Это поместит список файлов, которые вы хотите в массив filearray . Новые строки (и другие экзотические символы) в имени файла будут обрабатываться правильно.

    Настройка globstar позволяет ** в шаблонах glob сопоставляться между подкаталогами, предоставляя требуемый рекурсивный поиск.

    Установка nullglob просто заставляет расширение расширяться до нуля, если совпадений нет. В противном случае он будет расширяться до себя, что, вероятно, не то, что вы хотите.

    «/ tmp /» принимает 5 символов. Вот почему в тестах «9» (5 + 4)

     for i in /tmp/* ; do [ "${#i}" -eq 9 ] && printf %s\\n "$i"; done 

    или

     for i in /tmp/* ; do i="${i#/tmp/}"; # to get rid of /tmp/ [[ "${#i}" -eq 4 ]] && printf %s\\n "$i"; # there is 4 in test! done 

    FWIW. Он не терпит неудачу в новой строке (@cuonglm), может быть легко преобразован в список только 140 символов длинных имен файлов (@don_crissti).

    Поскольку globbing выполняется оболочкой, нет необходимости звонить ls или find, echo делает трюк:

     $ echo /tmp/???? /tmp/file $ 

    Единственное, если нет файла с именем длиной 4 символа, он просто распечатает

     /tmp/???? 

    Возможно, вам понадобится однострочный скрипт bash, который проверяет это, а также печатает один файл в строке:

     pattern=/tmp/????? ; for f in $pattern ; do if [ $f != "$pattern" ] ; then echo $f ; fi ; done 

    Как насчет:

     ls /tmp | grep -e '^.\{4\}$' 

    для ответа на основе grep .

    Linux и Unix - лучшая ОС в мире.