다음과 같은 파일 구조가 있습니다.
- /홈/데이터/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
변수는 접두사로만 인식되고 확장됩니다
$
. 루프가 변수 'i'를 정의하는 경우 다음을 사용해야 합니다.$i
그 가치를 원할 때마다:for i in */; do cd $i/*/
"현재 디렉터리"는 프로세스 전체에 적용되며 모든 루프 반복을 자동으로 재설정하지 않습니다. 나중에 수동으로 상위 디렉터리로 돌아가야 합니다.
cd $i/*/; mv * ../; cd ../../
또는 "하위 쉘"을 사용하여 디렉토리 변경 범위를 지정하십시오.
(cd $i/*/; mv * ../)
오류 검사를 수행하지 않습니다. 한 번이라도 실패 하면
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
개선 사항: 하위 디렉터리 와일드카드를 로 이동할 수 있으므로
mv
하위 디렉터리가 여러 개 있는 경우에도 작동할 수 있습니다.cd $i/ || exit mv */* . cd ../
개선 사항:
cd
전혀 필요 없이 이 작업을 수행할 수 있습니다.mv $i/*/* $i/