우리는 현재 이전에 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//\\/\/}
현재 파일 이름을 인쇄하고\
모두/
.\\
및 )으로 대체합니다. 및 는 모두 특수 문자이므로 이스케이프해야 합니다. 파일이 있는 디렉터리를 인쇄합니다. 예를 들어, 이 파일을 이동하려는 대상 디렉터리가 반환됩니다.\/
\
/
dirname
dirname /path/to/file
/path/to
$dir
filename=${file##*\\}
: 파일 이름,\
마지막 파일 이전의 모든 항목을 삭제하세요. 이는 실제 파일 이름이며$filename
.mkdir -p "$dir"
: 대상 디렉터리와 모든 상위 디렉터리를 만듭니다. make는 상위 디렉토리를-p
생성하고 (이미 존재하지 않는 한 상위 디렉토리 없이는 작동mkdir
하지 않음 ) 이미 존재하는 디렉토리에 대한 오류를 무시하도록 만듭니다.mkdir foo/bar
foo/
mv "$file" "$dir"/"$filename"
: 마지막 단계는 파일을 올바른 위치로 이동하는 것입니다.
답변2
prename 'mkdir $` while s[\\][/]' *\\*
prename
Perl 유틸리티(때때로 rename
. 이 명령의 기본 운영 모델은 명령줄을 통해 변경해야 하는 파일 이름을 제공하는 것입니다. 우리의 경우 *\\*
이름에 백슬래시가 하나 이상 포함된 모든 파일 이름이 제공됩니다.
그러면 작은따옴표 안의 코드가 파일 이름에 하나씩 적용되고 그 결과 $_
가 새로운 파일 이름이 됩니다.
while
백슬래시를 한 번에 하나씩 점진적으로 슬래시로 변경하고 문자열의 미리 일치하는 부분인 $` var가 가리키는 디렉터리를 만드는 루프를 설정했습니다 .
while 루프를 종료하면 $_
원래 디렉터리의 이름이 변경된 디렉터리/하위 디렉터리인 포함하는 디렉터리/하위 디렉터리/하위 디렉터리/하위 디렉터리/파일 이름.ext가 이제 존재합니다.