Использование подстановки имени файла & mdash; Как искать файлы с буквами в этом порядке?

Так что мне нужно найти все файлы, которые имеют d, o и g в имени файла. Буквы не должны быть рядом (aadaaoaagaa будет правильным именем файла, aaoaadaag не будет правильным именем файла). Не имеет значения, являются ли буквы заглавными или строчными (aadaaOaag - правильное имя файла, как и aaDoGa.

Как бы я использовал подстановку имени файла в командной строке терминала, чтобы вывести список всех файлов, как этот? Предпочтительно без используя циклы или что-то слишком сложное. Все, что я до сих пор представлял, это символы замены имени файла (*,?, [])

2
задан 28 September 2013 в 06:57

4 ответа

Для списка их, когда Вы находитесь в каталоге, где те файлы находятся в, можно использовать, как, Nykakin сказал в этом комментарии следующую команду:

ls *[dD]*[oO]*[gG]*

или, если Вы хотите каждый файл на его собственной строке, можно использовать:

printf '%s\n' *[dD]*[oO]*[gG]*

или, использование grep:

ls | grep [dD].*[oO].*[gG]
2
ответ дан 28 September 2013 в 06:57

Еще один способ взглянуть на проблему - сохранить только имена файлов, для которых после удаления каждого символа за пределами D, O или G результат будет точно DOG, без учета регистра.

Это можно сделать в оболочке с поиском-заменой-тестом вместо подстановочных знаков:

#!/bin/bash
shopt -s nocasematch 
shopt -s nullglob
for i in *
do
  if [[ ${i//[^dogDOG]/} == dog ]]; then 
    echo $i;
  fi;
done
0
ответ дан 28 September 2013 в 06:57

Я бы использовал Perl для этого:

perl -le 'print for grep {/\A[a-cefh-np-z]*d[a-fh-z]*o[a-z]*g[a-z.]*\Z/i} <*>'

Объяснение

  • <*> волшебно: оно возвращает результат сглаживания шаблона [ 112] из текущего каталога.
  • grep{} возвращает только те элементы Glob, отвечающих критериям внутри.
  • print выводит результат grep по одному элементу в строке благодаря опции -l.
  • Единственный критерий, используемый для grep, состоит в том, что имя файла состоит из:

    • любого количества букв в наборе [a-cefh-np-z] (алфавит минус o и g)
    • буква d
    • любое количество букв в наборе [a-fh-z] (алфавит минус g)
    • буква [ 1112]
    • любое число любой буквы вообще
    • буква g.
    • любое количество букв или точка (для расширений).
  • Модификатор i применяется к критерию регулярного выражения, чтобы гарантировать, что совпадение нечувствительно к регистру, как того требует вопрос.

Я знаю, что это не совсем то, что вы просили, но я считаю, что шаблоны подстановочных знаков Bash слишком просты для выполнения этой задачи.

0
ответ дан 28 September 2013 в 06:57

Если я понимаю Вашу проблему правильно, Вы хотите все те имена файлов с a d, o и a g, в любом случае (верхний или ниже). Radu Rădeanu дал Вам ответ, который работает на буквы, происходящие в порядке d-o-g. Например, aaGaaaoaaDaa не будет найден. Вы могли изменить его решение с помощью шести возможных перестановок в качестве, например,

ls *[dD]*[oO]*[gG]* *[oO]*[gG]*[dD]* *[gG]*[dD]*[oO]* *[oO]*[dD]*[gG]* *[dD]*[gG]*[oO]* *[gG]*[oO]*[dD]*

(установка shopt -s nullglob прежде хорошая идея).

Это становится немного грязным, таким образом, Вы могли бы хотеть также использовать shopt -s nocaseglob так, чтобы соответствие было выполнено без учета к случаю буквенных символов (заключенный в кавычки из Справочника Bash) как:

$ shopt -s nullglob nocaseglob
$ ls *d*o*g* *o*g*d* *g*d*o* *o*d*g* *d*g*o* *g*o*d*

Другая опция состоит в том, чтобы использовать команду находки в качестве, например,

$ find . -maxdepth 1 -iname '*d*' -iname '*o*' -iname '*g*' -type f

-maxdepth 1 опция состоит в том, чтобы ограничить текущим каталогом и не его подкаталогами и -type f ограничить поиск регулярными файлами. Измените эти опции соответствовать Вашим потребностям. -iname для поиска без учета регистра на имени (использующий шаблоны шарика). Не забывайте кавычки!

Одно преимущество находки состоит в том, что Вы сможете -exec наполните, если необходимо выполнить какую-либо операцию на этих файлах, например, переименовав их, или добавив материал им, и т.д. Другое преимущество состоит в том, что, если у Вас есть огромное количество таких файлов, globbing возьмет возрасты и мог бы даже переполнить максимального количества позволенных аргументов. находка будет в порядке, независимо от того, что количество файлов.

Надеюсь, это поможет!

Править. Кажется, что я отсутствовал в этой части порядка в Вашем заголовке. Ха-ха-ха. Ну, затем команда находки просто была бы:

$ find . -maxdepth 1 -iname '*d*o*g*' -type f

и ls/printf решение было бы:

$ shopt -s nullglob nocaseglob
$ ls *d*o*g*
$ printf '%s\n' *d*o*g*
2
ответ дан 28 September 2013 в 06:57

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

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