Я пытаюсь найти команду оболочки, которая возвращает имена файлов файлов, которые содержат другие файлы с тем же именем, что и их в определенном каталоге
То, что вы попросите, - это команда, которая находит файлы, имя которых совпадает с именем их родительского каталога.
Вы можете сделать это с помощью 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$'
./baz/baz
Если вы хотите распечатать только имя (а не полный путь), вы можете использовать -printf
find . -regextype egrep -regex '.*/([^/]*)/\1$' -printf '%f\n'
То, что вы попросите, - это команда, которая находит файлы, имя которых совпадает с именем их родительского каталога.
Вы можете сделать это с помощью 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$'
./baz/baz
Если вы хотите распечатать только имя (а не полный путь), вы можете использовать -printf
find . -regextype egrep -regex '.*/([^/]*)/\1$' -printf '%f\n'