
메인 디렉토리에서 내부에 여러 개의 하위 디렉토리가 있는 별도의 디렉토리로 이동하려는 파일이 많습니다.
파일 명명 규칙 예 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 {} \;