내 홈 디렉토리에는 수많은 디렉토리가 있습니다. 각 디렉터리에는 여러 수준의 하위 디렉터리가 있습니다. 그 중에는 이라는 이름의 사람도 있습니다 Info.plist
.
이 Info.plist
파일에는 다음 줄이 있습니다.
<string>/Users/Shared/Library/Mail/V7/74309-67B6-44E3-BD66-9384D1E54398/Junk.mbox</string>
이 줄은 파일당 하나 이상일 수도 있고 다를 수도 있습니다.
<string>/Users/Shared/Library/Mail/V7/74398/Junk.mbox</string>
<string>/Users/Shared/Library/Mail/V7/7-67B8/Sent.mbox</string>
<string>/Users/Shared/Library/Mail/V7/OLD/Old.mbox</string>
Info.plist
이 파일에서 이러한 줄을 찾아 섹션 Shared
을 Fireball
.
따라서 이전 줄은 다음과 같습니다.
<string>/Users/Fireball/Library/Mail/V7/74398/Junk.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/7-67B8/Sent.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/OLD/Old.mbox</string>
나머지는 그대로 두십시오.
따라서 먼저 디렉터리 구조를 재귀적으로 검색하고, 해당 Info.plist
파일에 포함된 모든 파일을 찾고, 각 파일에서 해당 경로에 사용된 Info.plist
키워드가 있는지 검색하여 .Shared
Fireball
이를 수행하기 위해 마법의 UNIX 명령을 어떻게 사용합니까?
이것저것 가지고 놀고 있어요
find . -type f -name Info.plist -exec sed 's/Shared/Fireball/g' {} +
이는 콘솔에 올바른 변경 사항을 인쇄하기 때문에 거의 작동하는 것처럼 보이지만 파일은 변경되지 않았습니다.
답변1
플래그의 내부 편집(주요 운영 체제에서 흔히 볼 수 있는 대부분의 플래그)을 sed
지원한다고 가정하면 다음을 수행할 수 있습니다.-i
find . -type f -name Info.plist -exec sed -i 's/Shared/Fireball/g' {} +
그렇지 않은 경우 다음을 시도해 볼 수 있습니다 perl
.
find . -type f -name Info.plist -exec perl -i -pe 's/Shared/Fireball/g' {} +
Shared
문자열의 모든 인스턴스가 대체하려는 인스턴스인지 확인하세요 . 안전을 확보하려면 더 많은 경로를 사용하는 것이 더 안전할 수 있습니다.
find . -type f -name Info.plist -exec sed -i 's|/Users/Shared/Library/|/Users/Fireball/Library|g' {} +
답변2
주문하다
find . -type f -iname Info.plist -exec sed "/<string>\/Users\/Shared\/Library\/Mail/s/Shared/Fireball/g" {} \; 2>/dev/null
산출
<string>/Users/Fireball/Library/Mail/V7/74398/Junk.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/7-67B8/Sent.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/OLD/Old.mbox</stri