왼쪽 및 오른쪽 사각형이 포함된 디렉터리의 이름을 바꾸려면 다음을 사용할 수 있습니다.
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
무슨 일이 일어나고 있는지 확인하고 싶거나 구현이 이를 지원하지 않는 경우 두 가지를 모두 제거할 수 있지만 스크립트는 덜 강력해집니다.
path
glob(정규 표현식 아님)을 사용하여 변수를 할당할 때 file
수정자 및 match . 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