백슬래시가 포함된 디렉터리에서 일부 파일을 찾아 이름을 바꾸기 위해 여러 가지 방법을 시도했습니다. 웹 응용 프로그램에서 생성된 이러한 파일에는 따옴표가 없습니다. 찾기 및 바꾸기를 시도했지만 상위 수준에서는 실패한 것 같습니다. 기본적으로 상위 폴더의 이름을 바꾸지만 삭제할 때 이전 상위 이름을 참조하기 때문에 하위 폴더로 드롭다운할 수 없는 것과 같습니다.
폴더 구조:
'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\bc
a\b\c
abc
답변2
두 "es"를 동시에 삭제하려고 하고 "./anoter" 디렉터리가 존재하지 않기 때문에 오류 메시지가 나타나는 것으로 추측됩니다.
find.txt 파일에 추가하기만 하면 -type f
디렉토리 구조의 모든 파일을 처리할 수 있습니다. 그러나 하위 디렉터리 레벨이 하나뿐이라는 것을 알고 있는 경우(또는 이름에 'es만 있는 최소 한 레벨)는 여전히 해당 디렉터리를 갖고 있으며 find를 사용하여 해당 디렉터리를 찾을 수 있습니다 -type d
. ano\ther/d\ir/
동일한 오류로 인해 실패합니다.
-execdir
on 대신에 using -exec
(및 using ) 과 관련된 내용을 얻을 수도 있지만 -depth
저는 시도해 본 적이 없으므로 -execdir
맨 페이지에서 제안 사항을 빠르게 읽었습니다. 생각해보면 이렇게 하면 파일을 먼저 처리해야 할지도 모르겠습니다.