
왼쪽 및 오른쪽 사각형이 포함된 디렉토리의 이름을 바꾸려면 다음을 사용할 수 있습니다.
shopt -s globstar
rename -n 's/\(|\[|\]|\)//g' **
그러면 현재 있는 디렉토리에서 재귀적으로 [ & ]로 모든 이름이 변경됩니다.
하지만 이것을 nemo.action 스크립트로 실행해야 하는데 작동하지 않습니다. (기본적으로 일반 bash 스크립트)
내 현재 스크립트는 다음과 같습니다
#!/bin/bash
shopt -s globstar
rename "$@" 's/\(|\[|\]|\)//g' **
어디에$@
/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]
어디에[ hdjue] [kskk]
(그냥 임의의 문자)이름을 바꾸려는 시작 폴더와 다음 파일/폴더는 다음과 같습니다.
물론 이것은 작동하지 않습니다. 이제 상위 디렉토리로 이동하여 첫 번째 줄을 실행해야 하지만 그렇게 하면 상위 디렉토리의 모든 디렉토리가 처리됩니다.
[ hdjue] [kskk]
이 문제를 해결하는 방법을 아는 사람이 없을 뿐 아니라요?
이름 바꾸기 기능이 시작 디렉토리를 처리할 수 없는 것 같나요?
그리고 가능하다면 모든 공백을 제거하고(.(점)으로 대체) 파일 이름/디렉토리를 소문자로 만들어 외부/내부 요청과의 호환성을 단순화합니다.
답변1
제가 이해하는 바에 따르면 여기서 요구 사항은 지정된 경로 및 그 아래의 파일과 디렉터리에서 및 문자 [
의 모든 인스턴스를 제거하는 것입니다.]
어려운 점은 디렉터리를 탐색하는 동안 디렉터리 이름을 바꾸는 것을 피하는 것입니다. globstar는 **
깊이 우선이 아닌 루트부터 항목을 나열하므로 와 같은 예가 주어 지면 이름을 a
a/b
a/b/c
바꾸면 및 경로가 더 이상 유효하지 않음 a
을 의미합니다 . 옵션 은 를 사용하여 이를 처리할 수 있지만 다른 접근 방식이 필요합니다.a/b
a/b/c
find
-depth
#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
while IFS= read -d '' -r item
do
path="${item%/*}" file="${item##*/}" # Separate path and file name parts
name="${file//[[\]]/}" # Generate new file name
name="${name// /.}" # Comment: space becomes dot
name="${name,,}" # Comment: lowercase name
echo mv -f "$item" "$path/$name" # Rename
done
echo
스크립트가 기대한 대로 작동하면 제거 (또는 보완)하십시오.
나는 정말로 이상한 파일 이름을 가진 파일을 처리하기 위해 옵션 -print0
과 함께 사용했습니다 (줄 바꿈 및 인쇄할 수 없는 문자가 포함된 파일 포함). 무슨 일이 일어나고 있는지 보고 싶거나 구현이 이를 지원하지 않는 경우 두 가지를 모두 제거할 수 있지만 그러면 스크립트가 덜 견고해집니다.-d ''
read
glob(정규 표현식 아님)을 사용하여 변수 path
, file
및 일치를 할당할 때 수정자입니다. name
단일 수정자( %
, #
, /
)는 가장 짧은 일치 또는 단일 일치를 의미합니다. 이중 수정자( %%
, ##
, //
)는 가장 긴 일치 또는 여러 일치를 의미합니다. 맨 페이지 에 모두 문서화되어 있지만 bash
여기에 컨텍스트에 대한 설명이 있습니다.
${item%/*}
는%
다음을 나타냅니다.가장 짧은glob 패턴과 일치하는 항목은끝의 가치 중$item
. 따라서a/b/c
우리는 텍스트 일치를 제거하여/*
남겨 둡니다.a/b
${item##*/}
는##
다음을 나타냅니다.가장 긴glob 패턴과 일치하는 항목은시작의 가치 중$item
. 따라서a/b/c
우리는 텍스트 일치를 제거하여*/
남겨 둡니다.c
${file//[[\]]/}
는//
다음을 나타냅니다.다수의glob의 교체는 다음 텍스트/
, 즉 아무것도 아닌 텍스트로 교체되어야 합니다. glob은 " 또는 "을 의미하는 두 문자[
및 의 대괄호 모음입니다 . 그래서 우리는 결국]
[
]
ab[cd]ef[gh
abcdefgh