다음과 같은 폴더 구조가 있습니다.
/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