나열된 디렉터리의 모든 파일을 한 수준 위로 이동합니다.

나열된 디렉터리의 모든 파일을 한 수준 위로 이동합니다.

디렉터리 트리가 있고 일부 디렉터리를 삭제하고 모든 파일을 해당 디렉터리에서 한 수준 위로 이동해야 합니다.

단계별로 수행하는 방법을 알고 있지만 수천 개가 있으므로 프로세스를 최적화해야 합니다.

디렉터리를 찾은 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

내가 아는 가장 안전한 방법은 다음과 같습니다.

  1. cd"당신의 디렉토리는 어디에 있습니까?"
  2. 이제 tar다음을 사용하여 어딘가에 저장하십시오: tar -cvf"저장할 파일 이름, 예: /tmp/mysavfil.tar" "모든 디렉토리 이름, 예: foo bar etc" 그러면 다음을 얻을 수 있습니다.tar -cvf /tmp/mysavfil.tar foo bar
  3. 그런 다음 다음을 수행하십시오.cd ..
  4. 그 다음에:tar xvf /tmp/mysavfil.tar
  5. 또는 더 이상 필요하지 않은 파일을 삭제하려면 다음과 같이 하십시오: cd"파일이 있던 원래 위치" rm -rf foo bar;rm /tmp/mysavefiltar
  6. 넌 끝났어

더 간단한 방법은 다음과 같습니다.

  • mv foo bar ../.

관련 정보