왼쪽/오른쪽 사각형을 포함하는 디렉토리 이름 바꾸기

왼쪽/오른쪽 사각형을 포함하는 디렉토리 이름 바꾸기

왼쪽 및 오른쪽 사각형이 포함된 디렉터리의 이름을 바꾸려면 다음을 사용할 수 있습니다.

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/ba/b/cfind-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무슨 일이 일어나고 있는지 확인하고 싶거나 구현이 이를 지원하지 않는 경우 두 가지를 모두 제거할 수 있지만 스크립트는 덜 강력해집니다.

pathglob(정규 표현식 아님)을 사용하여 변수를 할당할 때 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[ghabcdefgh

관련 정보