일치하는 하위 문자열이 있는 파일을 찾아 디렉터리로 이동합니다.

일치하는 하위 문자열이 있는 파일을 찾아 디렉터리로 이동합니다.

내 디렉토리에는 .idat또는로 끝나는 파일 쌍 목록이 포함되어 있습니다._Grn_Red

각 쌍에 대해 첫 번째 구분 기호 앞에 하위 문자열로 명명된 디렉터리를 만들고 _파일을 해당 디렉터리로 이동하려고 합니다.

디렉터리가 존재하지 않으면 파일을 이동하기 전에 디렉터리를 만드십시오.

내 코드:

for file in *.idat; 
do directory_name=${file%_*} \ 
mkdir directory_name \ 
if ${file%_*}==directory_name; 
then 
mv $file directory_name;
fi; 
done

역 추적:

-bash: syntax error near unexpected token `then'

파일 이름:

00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid_Grn.idat 
00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid_Red.idat 

0317b249-9256-47fe-9533-3ca91c07e3fd_noid_Grn.idat 
0317b249-9256-47fe-9533-3ca91c07e3fd_noid_Red.idat

039f8688-b4cd-4931-a8f5-40bcb1fbd8f0_noid_Grn.idat  
039f8688-b4cd-4931-a8f5-40bcb1fbd8f0_noid_Red.idat

예상 폴더 이름:

00f3408c-5ad1-4afb-9eac-3392aa92e42c
0317b249-9256-47fe-9533-3ca91c07e3fd
039f8688-b4cd-4931-a8f5-40bcb1fbd8f0

답변1

다음과 같아야 합니다.

shopt -s nullglob extglob # dotglob
for file in [^_]*_@(Grn|Red).idat; do
  dirname=${file%%_*}
  mkdir -p -- "$dirname" &&
    mv -- "$file" "$dirname"
done

dotglob(숨겨진 항목도 고려하려면 주석을 해제하세요.)

\줄의 끝은줄 연속. 가독성을 높이기 위해 긴 줄을 끊는 데 사용됩니다.

do directory_name=${file%_*} \ 
mkdir directory_name \ 
if ${file%_*}==directory_name

동일합니까?

do directory_name=${file%_*} mkdir directory_name if ${file%_*}==directory_name

따라서 이름이 지정된 디렉터리를 mkdir생성 하고 해당 환경에 전달하도록 요청 합니다 .directory_nameif00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid==directory_namedirectory_name=00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid

그러면 쉘은 then해당하는 if.

에서 패턴 일치를 수행하려면 생성자나 연산자를 bash사용할 수 있지만 여기서는 필수가 아닙니다.case[[ text = pattern ]]

--또한 목록 컨텍스트의 확장은 bash에서 인용되어야 하며 대부분의 명령의 경우 옵션이 아닌 인수는 옵션과 분리되어야 합니다.

${var%pattern}삭제가장 짧은끝에 있는 패턴과 일치하는 문자열입니다 $var. ${var%%pattern}첫 번째 문자열의 모든 문자열을 삭제하려면 가장 긴 문자열을 삭제 해야 합니다 _. [^_]*... 파일이 a로 시작하지 않도록 하기 위해 as glob 패턴을 사용한다는 점을 알 수 있습니다 . _이로 인해 빈 디렉터리 이름이 생성됩니다.

Grn파일당 항상 하나의 파일이 있다는 것을 알고 있는 경우 다음을 수행하여 합계 호출 수를 절반으로 줄일 수 있습니다 Red.mkdirmv

shopt -s nullglob # dotglob
for file in [^_]*_Red.idat; do
  dirname=${file%%_*}
  mkdir -p -- "$dirname" &&
    mv -- "$file" "${file%_*}_Grn.idat" "$dirname"
done

관련 정보