파일 및 디렉터리 이름에서 모든 선행 및 후행 공백을 반복적으로 제거합니다.

파일 및 디렉터리 이름에서 모든 선행 및 후행 공백을 반복적으로 제거합니다.

내 디렉토리 구조는 다음과 같습니다.

.
├── ParentDirectory
│   ├── ChildDirectory1
│   │   ├── 01-File.txt
│   │   ├── 02-File.txt
│   │   ├──      03-File.adoc
│   │   ├──    04-File.md
│   │   └──     05-File.txt
│   ├──     ChildDirectory2
│   │   ├── 01-File.txt
│   │   ├── 02-File.txt
│   │   ├──    03-File.adoc
│   │   ├── 04-File.txt
│   │   ├── 05-File.txt
│   │   └──     06-File.md
│   ├── ChildDirectory3
│   │   ├──     01-File.txt
│   │   ├── 02-File.txt
│   │   ├── 03-File.adoc
│   │   ├── 04-File.md
│   │   ├──    05-File.md
│   │   └── 06-File.txt

일부 파일과 디렉토리에는 앞에 공백이 있다는 것을 눈치챘을 것입니다. 일부 파일과 디렉터리에도 뒤에 공백이 있다는 것을 눈치채지 못할 수도 있습니다.

후행 공백의 경우 다음을 시도했습니다.

% find . -exec rename 's/ *$//' {} +

이 명령을 여러 번 실행해야 합니다. 처음 실행되면 상위 디렉터리의 이름이 변경됩니다. 두 번째 실행에서는 하위 이름이 변경됩니다. 내 디렉토리 구조는 실제로 훨씬 더 깊습니다. 따라서 명령을 여러 번 실행하는 것은 좋은 해결 방법이 아닙니다.

선행 공백에서는 전혀 작동하지 않습니다 find . -exec rename 's/^ *//' {} +.

파일 이름과 디렉터리 이름에서 모든 선행 및 후행 공백을 재귀적으로 제거하는 방법은 무엇입니까?

답변1

그리고 zsh:

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(**/)(*)' '$1${${2##[[:space:]]#}%%[[:space:]]#}'

( -n만족하면 삭제(테스트 실행)).

(#qD)숨겨진 파일과 숨겨진 디렉터리의 파일도 처리하려면 패턴 끝에 이를 추가하세요.

의 경우 rename다음과 같습니다.

find . -depth ! -name . -exec rename -n '
  my ($dir, $base) = m{(.*)/(.*)}s;
  $base =~ s/^\s*//;
  $base =~ s/\s*$//;
  $_ = "$dir/$base";' {} +

그러나 \s( zsh 와는 반대로 [[:space:]]) 로케일의 다른 공백 문자가 아닌 ASCII 공백에만 일치합니다. 이름 바꾸기를 시작하기 전에 충돌을 확인하는 보호 기능 rename도 없습니다 .zmv

어쨌든, GNU 시스템을 포함한 몇몇 시스템에서는 줄바꿈 방지 공백 문자(U+00A0)는 단어를 구분하는 데 사용되지 않으므로 공백으로 간주되지 않으므로 zmv 메서드를 사용해도 제거되지 않습니다. 이러한 문자가 있는 경우 다음을 사용하여 제거할 수 있습니다.

zmv -n '(**/)(*)' $'$1${${2##[[:space:]\ua0]#}%%[[:space:]\ua0]#}'

관련 정보