백슬래시가 있는 파일 이름을 파일이 있는 디렉터리 구조로 변환하는 스크립트를 찾고 있습니다.

백슬래시가 있는 파일 이름을 파일이 있는 디렉터리 구조로 변환하는 스크립트를 찾고 있습니다.

우리는 현재 이전에 Windows에서 실행되었던 새로운 애플리케이션을 Linux에서 테스트하고 있습니다. 프로그램에 일부 하드코딩된 경로가 있는 것으로 보이며, 백슬래시가 포함된 긴 파일 이름을 가진 테스트 파일 묶음이 생성됩니다. 예를 들어:

directory\subdirectory\subdirectory\subdirectory\filename.ext

이 파일을 가져와서 있어야 할 디렉터리를 만들고 그곳으로 이동해야 합니다. 예를 들어 위 파일은 실제로 다음과 같아야 합니다.

directory/subdirectory/subdirectory/subdirectory/filename.ext

어떻게 해야 하나요?

답변1

이름을 바꿔야 하는 경우모두이름에 이 포함된 파일의 경우 \다음을 수행할 수 있습니다.

for file in *\\*; do 
    dir="$(dirname -- "${file//\\/\/}")"
    filename="${file##*\\}"
    mkdir -p -- "$dir"
    mv -- "$file" "$dir"/"$filename"
done

설명하다

  • for file in *\\*:glob은 *\\*가 포함된 현재 디렉터리의 이름과 일치합니다 \. \이 문자도 이스케이프 문자이므로 리터럴로 처리되도록 이스케이프해야 합니다. 그렇기 때문에 우리는 *\*.

    그런 다음 이름에 포함된 모든 파일과 디렉터리를 반복 \하고 각각을 $file.

  • dir="$(dirname "${file//\\/\/}")": ${file//\\/\/}현재 파일 이름을 인쇄하고 \모두 /. \\및 )으로 대체합니다. 및 는 모두 특수 문자이므로 이스케이프해야 합니다. 파일이 있는 디렉터리를 인쇄합니다. 예를 들어, 이 파일을 이동하려는 대상 디렉터리가 반환됩니다.\/\/dirnamedirname /path/to/file/path/to$dir

  • filename=${file##*\\}: 파일 이름, \마지막 파일 이전의 모든 항목을 삭제하세요. 이는 실제 파일 이름이며 $filename.

  • mkdir -p "$dir": 대상 디렉터리와 모든 상위 디렉터리를 만듭니다. make는 상위 디렉토리를 -p생성하고 (이미 존재하지 않는 한 상위 디렉토리 없이는 작동 mkdir하지 않음 ) 이미 존재하는 디렉토리에 대한 오류를 무시하도록 만듭니다.mkdir foo/barfoo/

  • mv "$file" "$dir"/"$filename": 마지막 단계는 파일을 올바른 위치로 이동하는 것입니다.

답변2

prename 'mkdir $` while s[\\][/]' *\\*

prenamePerl 유틸리티(때때로 rename. 이 명령의 기본 운영 모델은 명령줄을 통해 변경해야 하는 파일 이름을 제공하는 것입니다. 우리의 경우 *\\*이름에 백슬래시가 하나 이상 포함된 모든 파일 이름이 제공됩니다.

그러면 작은따옴표 안의 코드가 파일 이름에 하나씩 적용되고 그 결과 $_가 새로운 파일 이름이 됩니다.

while백슬래시를 한 번에 하나씩 점진적으로 슬래시로 변경하고 문자열의 미리 일치하는 부분인 $` var가 가리키는 디렉터리를 만드는 루프를 설정했습니다 .

while 루프를 종료하면 $_원래 디렉터리의 이름이 변경된 디렉터리/하위 디렉터리인 포함하는 디렉터리/하위 디렉터리/하위 디렉터리/하위 디렉터리/파일 이름.ext가 이제 존재합니다.

관련 정보