bash를 사용하여 여러 디렉터리의 모든 파일을 상위 디렉터리로 이동하는 방법

bash를 사용하여 여러 디렉터리의 모든 파일을 상위 디렉터리로 이동하는 방법

다음과 같은 파일 구조가 있습니다.

  • /홈/데이터/C01/dir_wwe_346/file1.txt pic.jpg 무작위.sh
  • /홈/데이터/C02/dir_wwe_644/file1.txt pic.jpg 무작위.sh
  • /홈/데이터/C03/dir_wwe_324/file1.txt pic.jpg 무작위.sh

나는 그들이 이렇게 되기를 원합니다:

  • 홈/데이터/C01/file1.txt pic.jpg random.sh
  • 홈/데이터/C02/file1.txt pic.jpg random.sh
  • 홈/데이터/C03/file1.txt pic.jpg random.sh

기본적으로 여러 파일을 한 디렉터리 위로 이동하는 것입니다. 이 스크립트를 시도했지만 성공하지 못했습니다.

#!/bin/bash for i in */ do cd i/*/ mv * ../ done


이것을 게시한 후(그러나 아래 Grawity 응답을 읽기 전에) 적절한 변수 확장을 사용하지 않았다는 것을 깨달았고 다음을 실행했습니다.

#!/bin/bash for i in */ do cd ${i}*wwe* mv * ../ done

스크립트는 모든 하위 디렉터리를 데이터 폴더로 이동하므로 다음과 같이 끝납니다.

  • //C01/dir_wwe_346/file1.txt pic.jpg 무작위.sh
  • //C02/dir_wwe_644/file1.txt pic.jpg 무작위.sh
  • //C03/dir_wwe_324/file1.txt pic.jpg 무작위.sh

    내가 도대체 ​​뭘 잘못하고있는 겁니까?


추신. 제가 겪은 과정을 공개하고 이러한 답변으로부터 혜택을 받을 수 있는 신규 사용자에게 답변이 더 의미가 있도록 게시물을 편집했습니다. 감사합니다. 새로운 것을 배웠습니다. 저는 일주일 전에 bash를 배우기 시작했고 발전하고 있다고 느낍니다.

답변1

  1. 변수는 접두사로만 인식되고 확장됩니다 $. 루프가 변수 'i'를 정의하는 경우 다음을 사용해야 합니다.$i그 가치를 원할 때마다:

    for i in */; do
        cd $i/*/
    
  2. "현재 디렉터리"는 프로세스 전체에 적용되며 모든 루프 반복을 자동으로 재설정하지 않습니다. 나중에 수동으로 상위 디렉터리로 돌아가야 합니다.

    cd $i/*/; mv * ../; cd ../../
    

    또는 "하위 쉘"을 사용하여 디렉토리 변경 범위를 지정하십시오.

    (cd $i/*/; mv * ../)
    
  3. 오류 검사를 수행하지 않습니다. 한 번이라도 실패 하면 cd다음 사람이 mv불쾌한 일을 할 수 있습니다. 다음을 사용하여 명령을 결합하거나 &&반대 확인을 수행하고 || exit(또는 || break) 중 가장 적합한 것을 사용하십시오.

    for i in */; do
        cd $i/*/ && {
            mv * ../;
            cd ../../
        }
    done
    
    for i in */; do
        cd $i/*/ || exit
        mv * ../
        cd ../../
    done
    
    for i in */; do
        (cd $i/*/ && mv * ../)
    done
    
  4. 개선 사항: 하위 디렉터리 와일드카드를 로 이동할 수 있으므로 mv하위 디렉터리가 여러 개 있는 경우에도 작동할 수 있습니다.

    cd $i/ || exit
    mv */* .
    cd ../
    
  5. 개선 사항: cd전혀 필요 없이 이 작업을 수행할 수 있습니다.

    mv $i/*/* $i/
    

관련 정보