В этом коде, почему мы должны вставить bash после find ... -exec?;и в чем разница между {} и $ {} ссылками? - PullRequest
0 голосов
/ 03 мая 2019

Я использовал команды «find -exec», как в коде 1 и 2:

Код 1

find . -type d -exec chmod 775 {} +

Код 2

find . -type f -exec mv {} ./.. \;

Но иногда я вижу, что люди используют «bash» или «sh» сразу после «-exec», как в коде 3 и 4:

Код 3

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo \"\$(find \"{}\" -type f | wc -l)\" {}' \; | sort -nr

Код 4

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec bash -c 'echo \"\$(find \"\${1}\" -type f | wc -l) \"\${1}\" \"' -- \"{}\" \; | sort -nr"

Вопрос 1abc : Когда мы используем bash или sh после -exec?В эхо есть что-то особенное, в отличие от chmod и mv?Относится ли echo к bash, и если да, то как мне узнать, какие другие команды нуждаются в bash впереди?

Код 4 был предложенным улучшением для кода 3, потому что они сказали: " Вы должны передать имя файла ввнутренняя команда find в качестве аргумента. В противном случае вы столкнетесь с проблемами, если у одной из ваших папок будет имя с «внутри: », которое я могу понять.

Вопрос 2abc : Я не понимаю, как $ {1} делает его более безопасным, чем {}? Разве они не ссылаются на одно и то же? Я пытался заменить последнюю \ "{} \" деталь на \ "\ $ {1} \"как ниже, но это странно терпит неудачу. Я не понимаю почему.

Код 5

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec bash -c 'echo \"\$(find \"\${1}\" -type f | wc -l) \"\${1}\" \"' -- \"\${1}\" \; | sort -nr"
...