programing

setCaseSensitiveInfo를 모든 폴더 및 하위 폴더에 재귀적으로 적용

javajsp 2023. 8. 12. 09:49

setCaseSensitiveInfo를 모든 폴더 및 하위 폴더에 재귀적으로 적용

Windows(윈도우)에서 닷넷 코어 프로젝트를 "대소문자 구분"으로 구성하여 프로덕션 서버(linux)에서와 같이 작동하도록 하려고 합니다.

저는 다음과 같은 방법을 찾았습니다.

fsutil.exe file setCaseSensitiveInfo "C:\my folder" enable

문제는 이 함수가 재귀적이지 않다는 것입니다.

대/소문자 구분 플래그는 플래그를 적용하는 특정 폴더에만 영향을 미칩니다.해당 폴더의 하위 폴더에 자동으로 상속되지 않습니다.

그래서 저는 이것을 모든 폴더와 하위 폴더에 재귀적으로 적용하는 파워셸 스크립트를 만들려고 합니다.

비슷한 것을 구글에 검색해보고 명령줄만 수정해봤는데, 맞는 키워드를 찾지 못하는 것 같습니다.이것이 제가 이런 종류의 예에 가장 근접한 것입니다.

올바른 코드:

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ enable}

설명:

참고: 답변의 코드는 사용자가 디렉터리 트리의 루트에 있고 실행을 원하는 것으로 가정합니다.fsutil.exe댓글에서 지적했듯이 내부의 모든 폴더에 대해 (감사합니다. @Abhishek Anand!)

Get-ChildItem -Recurse -Directory모든 폴더의 목록을 제공합니다(연속적으로).

전체 경로를 통과하려면 다음을 사용하여 액세스할 수 있습니다..FullName[1] (또는 더 많은 자기 규제)| Select-Object -ExpandProperty FullName).

그런 다음 사용합니다.ForEach-Object리다달을 fsutil.exe여번러 현재 재현의파FullName를 사용하여 액세스할 수 있습니다.$_은 (으)로 .)ForEach-Object)[2].

힌트:

내용을 더 중인 할 수 .; Write-Host $_(비콜론);에서 분리하는 것입니다.fsutil호출) 댓글에서 지적했듯이 (펀드 모니카의 소송에 감사합니다!)


[1].FullName 3 버전인 PowerShell 3.0에서 합니다.Select-Object -ExpandProperty FullName낮은 버전이 사용될 가능성이 있는 경우 선호됩니다.

[2]$_는 의 별칭입니다.$PSItem

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {if (-Not ($_ -like '*node_modules*')) { fsutil.exe file setCaseSensitiveInfo $_ enable } }

@를 수정하여 @robdy @robdy 드코수를 제외할 수 node_modules위의 "node_modules" 비트를 포함하는 파일 경로를 제외할 모든 비트로 바꿀 수 있습니다.

만약 당신이 npm과 함께 일하고 있다면, 아마도 당신은 제외하고 싶을 것입니다.node_modules@robdy의 답변은 훌륭하지만, 패키지가 설치되어 있지 않더라도 모든 단일 노드 패키지 폴더에 대해 반복하는 데 몇 분이 걸렸습니다. 디렉토리가 항상 추가될 수 있고 수정할 내용이 없기 때문에 이 작업이 상당히 자주 실행되기를 원할 수 있습니다.node_modules그것을 제외하면 합리적인 것 같습니다.

Cygwin 및 bash 셸을 사용하면 다음을 수행할 수 있습니다.

$ find $THEDIR -type d -exec fsutil file setCaseSensitiveInfo "{}" enable \;

윈도우즈에서 에서 출력하는 '/' 문자를 처리하는 것으로 나타납니다.find명령어가 아주 좋습니다.

저의 경우에는 fsutil 도구를 사용하기 전에 먼저 Linux 하위 시스템을 활성화해야 했습니다.그래서 제 발걸음은:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

그런 다음 다시 시작하고 @robdy솔루션:

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ enable}

Windows 11에서는 디렉터리가 비어 있지 않아야 하므로 다른 대답이 올바르지 않습니다.이를 극복하기 위해 빈 디렉터리를 새로 만들고 fsutil 파일 setCaseSensitiveInfo를 사용하여 새 디렉터리에 대/소문자 구분 플래그를 설정한 다음 새 디렉터리 내의 다른 디렉터리에서 파일을 이동했습니다.이동할 때 디렉터리가 다시 생성되고 새 디렉터리가 대소문자를 구분하는 플래그를 상속하므로 이 기능이 작동합니다.

언급URL : https://stackoverflow.com/questions/51591091/apply-setcasesensitiveinfo-recursively-to-all-folders-and-subfolders