홈 디렉터리의 다른 디렉터리로 파일 정렬

홈 디렉터리의 다른 디렉터리로 파일 정렬

기본 디렉터리에서 내부에 여러 하위 디렉터리가 있는 별도의 디렉터리로 이동하려는 파일이 많이 있습니다.

파일 명명 규칙 예 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 {} \;

관련 정보