Linux에서 백슬래시가 있는 항목을 찾고 이름을 바꾸면 예상대로 작동하지 않습니다.

Linux에서 백슬래시가 있는 항목을 찾고 이름을 바꾸면 예상대로 작동하지 않습니다.

백슬래시가 포함된 디렉터리에서 일부 파일을 찾아 이름을 바꾸기 위해 여러 가지 방법을 시도했습니다. 웹 응용 프로그램에서 생성된 이러한 파일에는 따옴표가 없습니다. 찾기 및 바꾸기를 시도했지만 상위 수준에서는 실패한 것 같습니다. 기본적으로 상위 폴더의 이름을 바꾸지만 삭제할 때 이전 상위 이름을 참조하기 때문에 하위 폴더로 드롭다운할 수 없는 것과 같습니다.

폴더 구조:

'ano\ther' -> 'chi\ld'

내가 실행할 때 :

for file in `find . -name '*\\\*'`; do mv -v "$file" "${file/\\/}"; done`

또는

find . -exec rename 's/\\//g' {} +

또는

find . -name "*\\\*" -exec rename 's/\\//g' {} +

거의 모두 동일한 오류가 발생하지만 상위 디렉터리나 현재 디렉터리의 이름을 바꾸면 내림차순으로 실패합니다.

Can't rename ./ano\ter/yo\yo ./anoter/yoyo: No such file or directory

내 명령에서 무엇이 빠졌습니까?

답변1

다음을 수행해야 합니다.

  • 그런 식으로 find출력을 반복하지 마십시오.
  • `...`더 이상 사용되지 않는 명령 대체 형식을 피하세요.
  • 잎이 있는 가지보다 먼저 잎의 이름을 바꿉니다.
  • \전체 경로가 아닌 파일 이름의 s 만 제거하세요 .
  • 리터럴 백슬래시가 필요한 경우 큰따옴표를 사용하지 마세요.

그래서:

find . -depth -name '*\\*' -exec rename -d 's/\\//g' {} +

(이것은 perl 기반 변형을 가정 rename하고 이 -d옵션을 수락하면 기본 이름만 변경됩니다.)

또는:

find . -depth -name '*\\*' -exec zsh -c '
  for file do
    mv -v -- $file $file:h/${file:t:gs/\\/}
  done' zsh {} +

아니면 zsh에서는 다음과 같이 하세요.

autoload zmv
zmv -v '(**/)(*\\*)(#qD)' '$1$2:gs/\\/'

$var:s/string/replacement/여기서는 csh 스타일 (반복 포함 ) 이 사용되지만 g원하는 경우 ksh 스타일 ${var//pattern/replacement}( //반복 포함) 을 사용할 수도 있습니다.

zmv(#qD)기본값은 숨겨진 파일도 고려하여 일반적으로 원하는 깊이 우선 탐색을 수행하는 것입니다 . a 와 파일이 zmv모두 존재하는 등 특정 문제가 감지되면 둘 다 로 이름이 변경됩니다 .a\bca\b\cabc

답변2

두 "es"를 동시에 삭제하려고 하고 "./anoter" 디렉터리가 존재하지 않기 때문에 오류 메시지가 나타나는 것으로 추측됩니다.

find.txt 파일에 추가하기만 하면 -type f디렉토리 구조의 모든 파일을 처리할 수 있습니다. 그러나 하위 디렉터리 레벨이 하나뿐이라는 것을 알고 있는 경우(또는 이름에 'es만 있는 최소 한 레벨)는 여전히 해당 디렉터리를 갖고 있으며 find를 사용하여 해당 디렉터리를 찾을 수 있습니다 -type d. ano\ther/d\ir/동일한 오류로 인해 실패합니다.

-execdiron 대신에 using -exec(및 using ) 과 관련된 내용을 얻을 수도 있지만 -depth저는 시도해 본 적이 없으므로 -execdir맨 페이지에서 제안 사항을 빠르게 읽었습니다. 생각해보면 이렇게 하면 파일을 먼저 처리해야 할지도 모르겠습니다.

관련 정보