фильтрация вывода рекурсивной команды

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

-1
задан 20 April 2017 в 00:02

1 ответ

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

Вы можете сделать это, используя GNU find, с соответствием регулярного выражения, которое использует обратную ссылку на предыдущий компонент пути, например

find path/to/somedir -regextype egrep -regex '.*/([^/]*)/\1 

Если вы конкретно хотите найти простые файлы , которые соответствуют их родителям (исключая соответствующие подкаталоги ), вы можете добавить -type f в список предикатов (или если вы хотите только найти подкаталоги, используйте -type d).

Для иллюстрации приведем

$ tree
.
├── bar
│   ├── file1
│   ├── file2
│   └── file3
├── baz
│   ├── baz
│   ├── file1
│   ├── file2
│   └── file3
└── foo
    ├── file1
    ├── file2
    └── file3

3 directories, 10 files

, затем

$ find . -regextype egrep -regex '.*/([^/]*)/\1 

Если вы хотите напечатать только имя (а не полный путь), вы можете использовать -printf [ 1116]

find . -regextype egrep -regex '.*/([^/]*)/\1 -printf '%f\n'
./baz/baz

Если вы хотите напечатать только имя (а не полный путь), вы можете использовать -printf [ 1116]

find . -regextype egrep -regex '.*/([^/]*)/\1 -printf '%f\n'

Если вы конкретно хотите найти простые файлы , которые соответствуют их родителям (исключая соответствующие подкаталоги ), вы можете добавить -type f в список предикатов (или если вы хотите только найти подкаталоги, используйте -type d).

Для иллюстрации приведем

$ tree
.
├── bar
│   ├── file1
│   ├── file2
│   └── file3
├── baz
│   ├── baz
│   ├── file1
│   ├── file2
│   └── file3
└── foo
    ├── file1
    ├── file2
    └── file3

3 directories, 10 files

, затем

$ find . -regextype egrep -regex '.*/([^/]*)/\1 

Если вы хотите напечатать только имя (а не полный путь), вы можете использовать -printf [ 1116]

find . -regextype egrep -regex '.*/([^/]*)/\1 -printf '%f\n'
./baz/baz

Если вы хотите напечатать только имя (а не полный путь), вы можете использовать -printf [ 1116]

find . -regextype egrep -regex '.*/([^/]*)/\1 -printf '%f\n'
1
ответ дан 3 November 2019 в 10:25

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

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