#shell #find
Вопрос:
Я хотел бы заменить строку в файлах, которые находятся в определенных папках, другими словами, я должен избегать замены строки в файлах, которые находятся внутри определенной папки.
Моя структура папок такова,
classes - Test.ext1 - Test.ext2 objects - Test1.ext1 - Test1.ext2 staticresources - Avoid.ext1 - Avoid.ext2
В приведенной выше структуре папок мне нужно только заменить строку в содержимом файла внутри папки классы и объекты, а не в папке staticresources.
Я попробовал, как показано ниже,
outputfolder="deploymentFolder" echo "lt;---INFO Convert Source to Metadata Format---gt;" sfdx force:source:convert --rootdir ../force-app-core/main/default -d ../$outputfolder echo "lt;---INFO Replace with empty string in the converted source---gt;" find ../$outputfolder ! -path '../$outputfolder/staticresources/*.*' -type f -print0 | while IFS= read -r -d '' d; do echo "$d" sed -i "s/sp_core__//g" "$d" done echo "lt;---INFO Replace with empty string is Completed---gt;"
Тем не менее, я вижу файлы в папке staticresources, обработанные внутри цикла while.
Есть ли какой-либо способ избежать того, чтобы файлы, находящиеся в определенной папке, не обрабатывались?
Ответ №1:
Возникла проблема с вашей командой поиска:
find ../$outputfolder ! -path '../$outputfolder/staticresources/*.*' -type f -print0 |
Это не будет работать подобным образом, так как $outputfolder
следующая переменная -path
заключена в одинарные кавычки и, следовательно, не заменяется ее содержимым.
Я бы предложил изменить его следующим образом:
find ../$outputfolder ! -path ../$outputfolder/staticresources/'*.*' -type f -print0 |
Также обратите внимание, что *.*
здесь совпадают только файлы, содержащие точку. Если вы хотите исключить все файлы, используйте *
вместо этого:
find ../$outputfolder ! -path ../$outputfolder/staticresources/'*' -type f -print0 |
И последнее, но не менее важное: я бы предложил использовать двойные кавычки, чтобы сделать эту работу для путей, содержащих пробелы (не требуется для вашего конкретного примера, но в целом хорошая идея).:
find "../$outputfolder" ! -path "../$outputfolder/staticresources/*" -type f -print0 |