노트

노트

찾기 및 이름 바꾸기를 사용하여 모든 파일과 폴더에 사용자 정의 문자열을 반복적으로 추가합니다.

디렉터리와 모든 하위 디렉터리의 모든 항목에 "x"(따옴표 제외)를 추가하고 싶습니다. 저는 macOS Mojave 10.14.6 및 터미널을 사용하는 초보자입니다. 다운로드했습니다이름을 바꿔라이를 위해 Homebrew를 사용하십시오.

예:

/Old Project  
/Old Project/Abstract.rtf  
/Old Project/Manuscript.docx  
/Old Project/Data Analysis  
/Old Project/Data Analysis/Working Syntax.sps  
/Old Project/Data Analysis/Working Data.sav  
/Old Project/Data Analysis/Cleaned Data.sav  
/Old Project/Data Analysis/Figures  
/Old Project/Data Analysis/Figures/Figure 1.png  
/Old Project/Data Analysis/Figures/Figure 2.png   
/Old Project/Data Analysis/Raw Data  
/Old Project/Data Analysis/Raw Data/2020-06-26.csv  
/Old Project/Ethics 
/Old Project/Ethics/Application.pdf  
/Old Project/Ethics/Approval.pdf  
/Old Project/Ethics/Informed Consent.docx   

원하는 결과:

/x Old Project  
/x Old Project/x Abstract.rtf  
/x Old Project/x Manuscript.docx  
/x Old Project/x Data Analysis  
/x Old Project/x Data Analysis/x Working Syntax.sps  
/x Old Project/x Data Analysis/x Working Data.sav  
/x Old Project/x Data Analysis/x Cleaned Data.sav  
/x Old Project/x Data Analysis/x Figures  
/x Old Project/x Data Analysis/x Figures/x Figure 1.png  
/x Old Project/x Data Analysis/x Figures/x Figure 2.png   
/x Old Project/x Data Analysis/x Raw Data  
/x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv  
/x Old Project/x Ethics 
/x Old Project/x Ethics/x Application.pdf  
/x Old Project/x Ethics/x Approval.pdf  
/x Old Project/x Ethics/x Informed Consent.docx 

내가 지금까지 가지고 있는 것:

find . -depth (-execdir OR -exec) rename -n ’s/^/x /‘ {} +

find .현재 작업 디렉터리의 모든 파일과 디렉터리를 반복적으로 나열합니다. 경로를 포함한 파일 이름 목록이 출력됩니다.

-depth경로가 더 이상 존재하지 않기 때문에 이름이 변경된 디렉터리에서 이름이 변경되지 않은 파일을 찾을 수 없는 문제가 발생하지 않도록 find가 가장 낮은 깊이(하위 디렉터리의 맨 아래)에서 시작하도록 지시합니다. (하위 디렉터리 작업을 위해 이 찾기 및 이름 바꾸기 명령을 어떻게 사용할 수 있습니까?)

-exec찾기는 목록의 각 항목에 대해 이름 지정 명령(이름 바꾸기)을 수행합니다.

-execdirFind는 목록의 각 항목에 대해 명명된 명령(이름 바꾸기)을 수행합니다. 단, 한 가지 차이점은 먼저 각 하위 디렉터리로 이동한 다음 이름 바꾸기 명령에 파일 이름만 전달합니다(경로 없음).

renamePerl 정규식을 사용하여 명령 이름을 바꿉니다. 재귀적인 파일 이름 바꾸기를 자체적으로 처리할 수 없기 때문에 find가 필요합니다. 분명히 이것은 일부 시스템에서는 표준 명령이고 다른 rename 명령은 다른 시스템에서는 표준 명령이므로 약간의 혼란을 야기합니다.

-n실제로 실행하는 것이 아니라 무슨 일이 일어날지 보여주기 위해 이름 바꾸기가 표시됩니다.

’s///‘첫 번째 부분을 두 번째 부분으로 대체하여 대체를 수행하도록 이름 바꾸기를 지시합니다. 내 구문( ’s/^/x /‘)에서 ^(파일 이름 시작 부분의 토큰)을 x로 바꿉니다.

{}검색 중인 파일 목록으로 직접 이름을 변경합니다.

+find 명령을 종료하도록 지시합니다.


-exec비교적-execdir

-exec전체 파일 경로를 전달하세요. 이름 바꾸기는 이름 바꾸기 문서와 유사한 질문에 대한 답변에 설명된 대로 전체 파일 경로에서 작동합니다.

"이름 변경은 파일 이름뿐만 아니라 전체 경로에 적용됩니다."(http://plasmaturm.org/code/rename/)

"중간 참고 사항: 문제가 있습니다. 이름 바꾸기 모드는 >path가 포함된 파일 이름을 처리하지 않습니다. 문제를 해결하기 위해 노력하고 있습니다." (https://unix.stackexchange.com/a/153489)

따라서 를 사용하면 -exec"/Old Project/Data Analysis/Figures/x Figure 1.png" 대신 "x /Old Project/Data Analysis/Figures/Figure 1.png"가 표시됩니다. 이 문제를 해결하려면 비슷한 질문에 대한 답변에 설명된 대로 어떻게든 파일 이름 부분을 캡처하는 복잡한 정규식을 작성해야 한다고 생각합니다.

"마지막 구성요소만 수정하려는 경우 정규식을 에 고정 (\A|?<=/)하고 어떤 /와도 일치하지 않고 마지막 /만 일치하는지 확인할 수 있습니다."https://unix.stackexchange.com/a/166886)

이 답변에 제공된 정규식을 시도했지만 오류가 발생했으며("Quantier가 정규식의 어떤 항목도 따르지 않습니다...") 실제로 작동할지 잘 모르겠습니다. 이름이 변경된 버전의 .

execdir파일 이름만 전달하면 유망합니다. 실제로 명령을 테스트해 보니 계획된 모든 변경 사항이 완벽해 보였습니다. 그러나 실제 결과는 그렇지 않았습니다. 홈 디렉터리의 파일과 폴더 이름을 바꾸었지만 다른 모든 파일과 폴더를 찾는 데 실패했습니다. 존재하지 않는다고 합니다.

마침내 다음 답을 찾았습니다.

"find -execdir |이름 바꾸기

상대 경로의 광란이 아니었다면 이것은 기본 이름에만 작용하는 Perl 정규식 fu를 피하기 때문에 최선의 접근 방식이 될 것입니다.

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir 먼저 디렉토리에 CD를 넣은 다음 기본 이름에서만 실행합니다.

불행하게도 PATH 해킹 부분을 제거할 수 없습니다. find -execdir은 PATH에 상대 경로가 있는 경우 아무 작업도 거부합니다..."(디렉토리 아래의 모든 디렉토리를 소문자로 변경)

따라서 제가 이해한 바에 따르면 이 명령은 이론적으로 작동하므로 시험 실행에서는 작동하지만 실제로는 find이름 바꾸기 명령을 실행하기 위해 실제로 각 하위 디렉터리로 이동하는 것을 거부합니다.


내 질문:

  1. 용도 exec: 이름을 바꾸기 위해 전체 파일 경로에서 파일 이름을 분리하는 방법이 있습니까?
  2. 용도 execdir: find에게 절대 경로명을 사용하거나 가져오도록 요청하는 방법이 있습니까?

노트

저는 프로그래밍을 처음 접했습니다.

나는 이것이 매우 철저한 답변을 찾았습니다 (https://stackoverflow.com/a/54163971/13821837) 그러나 구문이 내 시스템에서 작동하는 것과 일치하지 않습니다.

답변1

사용도구:

처음 설치암소 비슷한 일종의 영양 find통과하다

brew install findutils

그 다음에:

gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;

이름 바꾸기 와 함께 perl.

-n출력이 좋아지면 스위치를 제거하십시오.

노트

  • -depth여기서 매우 중요한 점은 디렉터리 자체의 이름을 바꾸기 전에 디렉터리의 첫 번째 파일을 검토한다는 것입니다. (내림차순, 여기서는 필수).
  • 에서 -n나타냅니다rename시운전

확인하다정규식 설명.

대체 부분은 x $&리터럴 x+ space와 대체 부분 왼쪽의 마지막 완전 일치를 나타냅니다.s///

로컬 테스트:

./Old Project
./Old Project/Manuscript.docx
./Old Project/Data Analysis
./Old Project/Data Analysis/Working Syntax.sps
./Old Project/Data Analysis/Raw data
./Old Project/Data Analysis/Working Data.sav
./Old Project/Data Analysis/Figures
./Old Project/Data Analysis/Figures/Figure 2.png
./Old Project/Data Analysis/Figures/Figure 1.png
./Old Project/Data Analysis/Raw Data
./Old Project/Data Analysis/Raw Data/2020-06-26.csv
./Old Project/Data Analysis/Cleaned Data.sav
./Old Project/Ethics
./Old Project/Ethics/Informed Consent.docx
./Old Project/Ethics/Application.pdf
./Old Project/Ethics/Approval.pdf
./Old Project/Abstract.rtf

처리 후:

./x Old Project
./x Old Project/x Manuscript.docx
./x Old Project/x Data Analysis
./x Old Project/x Data Analysis/x Cleaned Data.sav
./x Old Project/x Data Analysis/x Figures
./x Old Project/x Data Analysis/x Figures/x Figure 2.png
./x Old Project/x Data Analysis/x Figures/x Figure 1.png
./x Old Project/x Data Analysis/x Raw Data
./x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
./x Old Project/x Data Analysis/x Raw data
./x Old Project/x Data Analysis/x Working Data.sav
./x Old Project/x Data Analysis/x Working Syntax.sps
./x Old Project/x Ethics
./x Old Project/x Ethics/x Application.pdf
./x Old Project/x Ethics/x Approval.pdf
./x Old Project/x Ethics/x Informed Consent.docx
./x Old Project/x Abstract.rtf

관련 정보