다음과 같이 상위 폴더 내에 하위 폴더 목록이 있습니다.
Parent folder
folder1
foldera
folder2
folderb
folder3
folderc
하위 폴더 이름에서 마지막 두 문자를 제거하여 두 번째 수준의 하위 폴더 이름을 바꾸고 싶습니다. 어떻게 해야 합니까? 나는 다음과 같은 것을 시도했습니다
find . -depth -type d -exec sh -c 'mv "${0}" "${0%??}"' {} \;
그러나 성공하지 못했습니다.
답변1
아니요 . 다음 디렉터리 구조를 고려하면 find
pure 와 함께 사용할 수 있습니다 .bash
./folder3
./folder3/folderc
./folder2
./folder2/folderb
./folder1
./folder1/foldera
주문하다:
for f in folder*/*/; do mv -v "$f" "${f%???}"; done
뒤쪽에:
./folder3
./folder3/folde
./folder2
./folder2/folde
./folder1
./folder1/folde
이것파일 이름 확장자여기서는 하위 폴더 내의 폴더만 일치 folder*/*/
하므로 끝에 슬래시가 있습니다. 이 mv
명령은 마지막 두 문자(위의 경우 3자)를 제거합니다. 왜냐하면 후행 슬래시도 변수 값에 계산되기 때문입니다.
답변2
비결은 최소 깊이와 최대 깊이 매개변수를 사용하는 것입니다. 이것은 제가 사용하는 명령입니다.
`find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;`
또한 내가 사용한 double ?? 대신 ${0$?}를 사용했다는 점에 유의하세요. 이와 같은 문제를 찾기 위해 디버그하는 한 가지 방법은 에코를 사용하여 작업을 추가하는 것입니다. 따라서 위의 예에서는 mv 명령 앞에 echo를 배치합니다.
$ find .
.
./folder
./folder/folder1
./folder/folder1/foldera
./folder/folder2
./folder/folder2/folderb
./folder/folder3
./folder/folder3/folderc
$ find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;
$ find .
.
./folder
./folder/folder1
./folder/folder1/folder
./folder/folder2
./folder/folder2/folder
./folder/folder3
./folder/folder3/folder
그런데 폴더의 상위 디렉터리에 있기 때문에 find .
or 를 사용할 수 있습니다. find folder
그러나 exec 명령을 사용하면 find .
상위 디렉터리 내의 모든 하위 디렉터리가 변환됩니다. 이동, 삭제 등을 할 때 일반적으로 예상치 못한 결과를 피하기 위해 디렉터리를 명시적으로 나열하는 것이 가장 좋습니다.