하위 폴더 이동 또는 이름 바꾸기

하위 폴더 이동 또는 이름 바꾸기

다음과 같은 폴더 구조가 있습니다.

/ms/files/a/
/fb/files/a/
/db/files/a/

다음과 같아야 합니다.

/ms/files/b/
/fb/files/b/
/db/files/b/

다음을 사용하여 이동하거나 이름을 바꿔야 하는 폴더를 찾을 수 있습니다.

find . -path "*/files/a" -type d

그러나 결과의 이름을 바꾸는 방법은 무엇입니까?

답변1

일방 통행:

for d in /*/files/a/
do
  mv "$d" "${d%a/}b"
done

*... 모든 초기 "클라이언트" 최상위 디렉터리와 원하는 하위 디렉터리 구조를 일치시키는 데 사용됩니다 /files/a/. 그런 다음 매개변수 확장을 사용하여 a/각 매개변수의 꼬리를 제거한 다음 이름을 b바꾸기 위해 매개변수를 로 "대체"합니다.

답변2

해커 솔루션:

eval $(find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/')

Sed는 mv 명령에 대한 매개변수를 생성합니다. 그런 다음 출력이 평가됩니다.

을 삭제하면 eval $()경로에 있는 세 개의 테스트 폴더에서 실행되는 것처럼 보입니다.

$ find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/'
mv ./client1/files/a ./client1/files/b;
mv ./client2/files/a ./client2/files/b;
mv ./client3/files/a ./client3/files/b;

답변3

다음 방법으로 수행되었으며 훌륭하게 작동합니다.

for i in /ms/files/  /fb/files/ /db/files/; do find $i -type d; done| sed -n '/a$/p'| awk '{print "sudo mv" " " $1 " " substr($1,1,10)"b/"}'|sh

관련 정보