фильтрующий выход рекурсивной команды

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

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

2 ответа

То, что вы попросите, - это команда, которая находит файлы, имя которых совпадает с именем их родительского каталога.

Вы можете сделать это с помощью 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'
1
ответ дан 18 July 2018 в 14:36

То, что вы попросите, - это команда, которая находит файлы, имя которых совпадает с именем их родительского каталога.

Вы можете сделать это с помощью 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'
1
ответ дан 24 July 2018 в 20:25

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

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