내 디렉토리에는 .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_name
if
00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid==directory_name
directory_name=00f3408c-5ad1-4afb-9eac-3392aa92e42c_noid
그러면 쉘은 then
해당하는 if
.
에서 패턴 일치를 수행하려면 생성자나 연산자를 bash
사용할 수 있지만 여기서는 필수가 아닙니다.case
[[ text = pattern ]]
--
또한 목록 컨텍스트의 확장은 bash에서 인용되어야 하며 대부분의 명령의 경우 옵션이 아닌 인수는 옵션과 분리되어야 합니다.
${var%pattern}
삭제가장 짧은끝에 있는 패턴과 일치하는 문자열입니다 $var
. ${var%%pattern}
첫 번째 문자열의 모든 문자열을 삭제하려면 가장 긴 문자열을 삭제 해야 합니다 _
. [^_]*...
파일이 a로 시작하지 않도록 하기 위해 as glob 패턴을 사용한다는 점을 알 수 있습니다 . _
이로 인해 빈 디렉터리 이름이 생성됩니다.
Grn
파일당 항상 하나의 파일이 있다는 것을 알고 있는 경우 다음을 수행하여 합계 호출 수를 절반으로 줄일 수 있습니다 Red
.mkdir
mv
shopt -s nullglob # dotglob
for file in [^_]*_Red.idat; do
dirname=${file%%_*}
mkdir -p -- "$dirname" &&
mv -- "$file" "${file%_*}_Grn.idat" "$dirname"
done