Вы можете просто добавить запятую в конце каждой строки, а в последней строке удалить ее:
sed -e 's/$/,/' -e '$s/,$//'
Используйте GNU find
с -path
, который ищет совпадения по всему пути:
$ find. -path '*/c/e'
./a/c/e
Это будет соответствовать любому файлу или каталогу с именем e
, который находится в каталоге с именем c
.
В качестве альтернативы, если у вас нет GNU find
или любого другого, поддерживающего -path
, вы можете сделать:
$ find. -type d -name c -exec find {} -name e \;
./a/c/e
Хитрость заключается в том, чтобы сначала найти все c/
каталоги, а затем искать только в них то, что называется e
.
В дополнение к решению @terdon я привожу здесь альтернативную версию для тех, у кого нет GNU find (, которую я смог найти, только следуя его идее!):
find. -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null
Кажется, это работает на моей машине
Для проверки:
# add files under each directories as otherwise some solutions would
# list also files under any "c/e" subdirs...
# in a subdir : do :
mkdir -p a b c a/b a/c a/c/e a/c/d/e a/c/d/e/c/e/f/g
for i in $(find */ -type d -ls); do ( cd "$i" && touch a b c d e ) ; done
# this will creates several files under each subdirs, wherever it can (ie, when they don't match a subdir's name).
# then test:
find. -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null
# and it answers only the 2 matching subdirs that match name "c/e":
inode1 0 drwxr-xr-x 1 uid gid 0 nov. 2 17:57./a/c/e
inode2 0 drwxr-xr-x 1 uid gid 0 nov. 2 18:02./a/c/d/e/c/e