Как я могу найти файл, имя которого включает данную строку, такую как “abcde”?

Не с GNU cp, по крайней мере.

Вам настоятельно рекомендуют не иметь названия дубликата файла (игнорирующий регистр), они просто вызовут Вас мир боли. Найдите список такого использования дубликатов

find . | tr A-Z a-z | sort | uniq -d

Затем вручную переименуйте один из файлов для каждой строки, если произведено. Постарайтесь не создавать дубликаты в будущем.

7
19.09.2012, 12:27
4 ответа

find просмотрит структуру каталогов и возвратит результаты на основе шарика:

find /your/dir -name "*abcde*"

Добавление -type f переключатель совершенствует Ваши критерии поиска, чтобы только возвратить файлы.

find /your/dir -type f -name "*abcde*"

Вы могли также включать другие переключатели как -maxdepth 2 для ограничения поиска 2 уровнями каталогов ревут указанный.

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

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

13
27.01.2020, 20:14
  • 1
    Вы могли бы также хотеть добавить -type f к find так, чтобы Вы только получили результаты, которые являются файлами. find /your/dir -type f -name "*abcde*" –  Steven Pritchard 01.08.2011, 15:46
  • 2
    : я обновлю свой ответ.Спасибо. –  jasonwryan 01.08.2011, 21:30

Используйте найдите:

find path-to-search -name '*abcde*'
5
27.01.2020, 20:14

Если locate иски Вы (это быстро, но только так же хорошо как новое выполнение sudo updatedb). Можно работать locate использование его собственного встроенного regex средства...

Вот является параметр управляемым сценарием, чтобы сделать то, что Вы хотите. Назовите его с 1$ как "abcde", который Вы ищете и с последующими параметрами как каталоги:

#!/bin/bash
a=("$@"); r=''
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
locate --regex  "(${r:1}).*/[^/]*${a[0]}[^/]*$"

Вызов в качестве примера похож на это:

$ ./script_name 'z' "$HOME/bin/perl" "$HOME/type/stuff"

Как предложено jasonwryan, вот прокомментированная версия сценария.
Примите во внимание это locate всегда выводы полностью определяли пути.

#!/bin/bash

# Note: Do not use a trailing / for directory names
# 
# Any of the args can be an extended regex pattern. 
#
# Create an array `a` which contains "$1", "$2", "$3", etc... (ie. "$@")
# writing the $-args to an array like this (using quotes) solves 
#   any possible problem with embedded whitespace 
a=("$@")
#
# Set up an empty string which is to be built into a regex pattern 
#   of all directroy names (or an appropriate regex pattern)
r=''
#
# Each regex pattern is to be an extended regex    
# Each regex pattern is concatenated to the preceding one 
#   with the  extended-regex 'or' operator |
#
# Step through the array, starting at index 1 (ie, $2),
#   and build the 'regex-pattern' for the directories 
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
#
# Run 'locate' with
#                           |the target file pattern $1  | 
#                |zero-to-| |preceded and followed by    |
#                |-many   | |zero-to-many non-slash chars|
#                |anything| |               |‾‾‾‾‾‾‾‾‾‾‾‾
#                 ‾‾‾‾‾‾‾|| |               |   
locate --regex  "(${r:1}).*/[^/]*${a[0]}[^/]*$"
#        ________|      |  | 
#       |directory-regex| last
#       | in brackets ()| slash      
#       |stripped of its|
#       |leading "|"    |
#
3
27.01.2020, 20:14
  • 1
    Upvoted для сценария: но было бы полезно (экстенсивно) прокомментировать это так, ясно относительно того, что на самом деле продолжается там... –  jasonwryan 01.08.2011, 07:34
  • 2
    Хорошее задание, fred! Я был бы upvote снова, если я мог.Спасибо. –  jasonwryan 01.08.2011, 11:37
locate abcde | egrep "(dirA|dirB|dirC)" 

для набора каталогов dirA, dirB, dirC.

Или 3 находить-команды.

1
27.01.2020, 20:14

Теги

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