![홈 디렉터리의 다른 디렉터리로 파일 정렬](https://linux55.com/image/171288/%ED%99%88%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EB%8B%A4%EB%A5%B8%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%20%EC%A0%95%EB%A0%AC.png)
기본 디렉터리에서 내부에 여러 하위 디렉터리가 있는 별도의 디렉터리로 이동하려는 파일이 많이 있습니다.
파일 명명 규칙 예 1SA_1BA_1W.out, 2SA_3BA_3W.out, 4SA_2BA_5W.out... 각 SA, BA, W 또는 기타 항목을 한 번에 지정된 위치로 이동해야 하는 항목에 번호를 부여하는 방법이 있습니까? SA의 범위는 1-10, BA 1-4 등입니다. 현재 다음과 같은 스크립트 명령을 사용하고 있습니다.
find . -type f -name '1A_1HNO3_W.out' | xargs -I {} cp '{}' /location/A_HNO3
find . -type f -name '2SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '3SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '4SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '1SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '2SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '3SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '4SA_DEA_*W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
SA BA A HNO3 W MA EAM TMA DMA DEA 등과 같은 다양한 식별 약어가 포함된 1700개 이상의 파일이 있습니다. 이러한 파일을 추출하여 간단한 데이터베이스 구조로 전송할 수 있어야 합니다. "위치"는 기본 상위 디렉터리의 이름이 되며 SA_DEA_W와 같은 폴더는 상위 디렉터리 내의 하위 디렉터리입니다.
답변1
mv *SA_BA_W.out /location/SA_BA_W;
mv *SA_DEA_W.out /location/SA_DEA_W
등.
답변2
다음 명령을 사용하면 한 번에 디렉터리를 만들 수 있습니다.
하위 디렉터리 생성
ls *.out | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk ' { system("mkdir -p /location/" $0) }'
또는
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk '{ system("mkdir -p /location/" $0) }'
또는
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | xargs -I {} mkdir -p /location/{}
아래 for 루프를 사용하여 두 작업을 모두 수행할 수 있습니다.
하위 디렉터리를 만들고 파일을 해당 디렉터리로 이동합니다.
for i in $(ls *.out)
do
DIR_NAME=$(echo $i | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g')
test -d /location/$DIR_NAME || mkdir /location/$DIR_NAME
mv $i $DIR_NAME
done
답변3
당신은 시도 할 수 있습니다
find . -iname "*.out" -exec sh -c '
f=${1##*/};
f=${f%.out};
d=./location/$f/;
[ ! -d $f ] && mkdir -p $d;
mv $1 $d' sh {} \;
전제는 파일 경로에 공백이 없다는 것입니다.
송곳
모든 .out
파일을 찾고 각 파일을 대상으로 지정-exec .... \;
find . -iname "*.out" -exec sh -c '...script...` sh {} \;
구조
sh -c `...script......` sh {}
각 파일 이름을 다음과 같이 가져와 {}
스크립트에 다시 전달합니다 $1
.
마지막 디렉토리 경로를 제거 /
하고 다음과 같이 저장하십시오.f
f=${1##*/};
.out
접미사 제거
f=${f%.out};
원하는 디렉토리를 계산하여 다음과 같이 저장하십시오.d
d=./location/$f/;
디렉터리가 없으면 디렉터리와 상위 디렉터리를 만듭니다.-p
[ ! -d $d ] && mkdir -p $d;
움직이자
mv $1 $d' sh {} \;