Я использовал команды «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"