찾기 및 이름 바꾸기를 사용하여 모든 파일과 폴더에 사용자 정의 문자열을 반복적으로 추가합니다.
디렉터리와 모든 하위 디렉터리의 모든 항목에 "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
찾기는 목록의 각 항목에 대해 이름 지정 명령(이름 바꾸기)을 수행합니다.
-execdir
Find는 목록의 각 항목에 대해 명명된 명령(이름 바꾸기)을 수행합니다. 단, 한 가지 차이점은 먼저 각 하위 디렉터리로 이동한 다음 이름 바꾸기 명령에 파일 이름만 전달합니다(경로 없음).
rename
Perl 정규식을 사용하여 명령 이름을 바꿉니다. 재귀적인 파일 이름 바꾸기를 자체적으로 처리할 수 없기 때문에 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
이름 바꾸기 명령을 실행하기 위해 실제로 각 하위 디렉터리로 이동하는 것을 거부합니다.
내 질문:
- 용도
exec
: 이름을 바꾸기 위해 전체 파일 경로에서 파일 이름을 분리하는 방법이 있습니까? - 용도
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