Замените строку внутри содержимого файла определенных папок

#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 |