디렉터리 트리가 있고 일부 디렉터리를 삭제하고 모든 파일을 해당 디렉터리에서 한 수준 위로 이동해야 합니다.
단계별로 수행하는 방법을 알고 있지만 수천 개가 있으므로 프로세스를 최적화해야 합니다.
디렉터리를 찾은 find . -type d -name 'src'
다음 찾은 디렉터리의 모든 파일을 한 수준 위로 이동해야 합니다( ../
).
root
- one
-- two
--- src
- three
-- four
--- five
---- src
첫 번째 콘텐츠는 src
다음으로 이동되어야 two
하고 두 번째 콘텐츠는 src
다음으로 이동되어야 합니다.five
스크립트로 이 작업을 어떻게 수행할 수 있나요?
답변1
그것은 다음과 같습니다:
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \;
-i
로 표시되어 있으니 참고하세요 mv
. 어떤 내용을 다룰지 여부를 확인하라는 메시지가 표시되면 그렇게 할 것으로 예상하지 않는 한 "아니요"라고 대답해야 합니다.
src
나중에 이 디렉토리도 삭제하고 싶다고 말했으므로 다음을 사용하십시오.
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \; -exec rmdir {} \;
먼저 백업을 하세요.
답변2
src
각 수준에 중첩된 하위 디렉터리가 없고 src
최신 디렉터리 수준이라고 가정하면 다음 작업을 수행해야 합니다.
find . -path '*/src/*' -type f -execdir echo mv -t ../ {} +
답변3
내가 아는 가장 안전한 방법은 다음과 같습니다.
cd
"당신의 디렉토리는 어디에 있습니까?"- 이제
tar
다음을 사용하여 어딘가에 저장하십시오:tar -cvf
"저장할 파일 이름, 예: /tmp/mysavfil.tar" "모든 디렉토리 이름, 예: foo bar etc" 그러면 다음을 얻을 수 있습니다.tar -cvf /tmp/mysavfil.tar foo bar
- 그런 다음 다음을 수행하십시오.
cd ..
- 그 다음에:
tar xvf /tmp/mysavfil.tar
- 또는 더 이상 필요하지 않은 파일을 삭제하려면 다음과 같이 하십시오:
cd
"파일이 있던 원래 위치"rm -rf foo bar
;rm /tmp/mysavefiltar
- 넌 끝났어
더 간단한 방법은 다음과 같습니다.
mv foo bar ../.