이것은 내 디렉토리 구조이며 처음 두 디렉토리 이름만을 기준으로 지정된 디렉토리 rev 아래의 .html 파일 이름을 바꾸고 싶습니다. 이 작업을 수행하려면 명령을 어떻게 사용할 수 있습니까?
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `-- rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- rev5.html
| | `-- rev5.html~
예상 출력:
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `--checklist_13_rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- checklist_14_rev5.html
| | `-- rev5.html~
rev* 폴더 내의 모든 rev*.html 파일에 대해서만 동일한 예상 출력이 발생해야 합니다.
답변1
find
basename
다음은 , 및 의 조합을 사용하는 단일 라이너 입니다 dirname
.
find . -regex '.*/rev[0-9]+/rev[0-9]+.html' -exec sh -c 'mv -iv {} $(dirname {})/$(basename $(dirname $(dirname {})))_$(basename $(dirname {})).html' \;
기본적으로 find regex를 사용하여 rev#/rev#.html로 끝나는 경로를 얻고 이 조합을 사용하여 새 이름을 구성 dirname
하고 basename
상위 디렉터리와 상위 디렉터리의 상위 디렉터리 이름을 추출합니다.