폴더에 500000개의 파일이 있는데 해당 파일을 하위 폴더로 이동하고 싶습니다. 이러한 하위 폴더는 자동으로 생성되어야 합니다.
패턴은 입니다 {prefix}-{date}T{time}-{suffix}
.
폴더 구조는 다음과 같아야 합니다 {date}/{time}/{suffix}
.
Bash 스크립트를 사용하여 접두사를 제거했습니다.
#!/bin/bash
for f in prefix-* ; do
mv "$f" "${f/prefix-}"
done
답변1
파일 이름에 대시 -
나 대문자가 포함되어 있지 않다고 가정하면 T
다음 bash 루프를 빌드할 수 있습니다.
for f in *
do
date=$(tmp=${f#*-};echo ${tmp%T*})
time=$(tmp=${f#*T};echo ${tmp%-*})
suffix=${f##*-}
mkdir -p ${date}/${time}/${suffix}
mv $f ${date}/${time}/${suffix}/
done
매뉴얼 페이지에 따르면 이는 기본 bash 매개변수 확장 구문입니다.
${parameter#word} ${parameter##word} Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pat‐ tern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of param‐ eter with the shortest matching pattern (the ``#'' case) or the longest matching pattern (the ``##'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expan‐ sion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list. ${parameter%word} ${parameter%%word} Remove matching suffix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pat‐ tern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ``%'' case) or the longest matching pattern (the ``%%'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.
Bash는 확장 작업의 직접 중첩을 허용하지 않기 때문에 임시 변수를 자리 표시자로 사용했습니다.
date=$(tmp=${f#*-};echo ${tmp%T*})
$f
현재 파일 이름은 다음과 같습니다 . 이때
tmp={f#*-}
첫 번째 파일 이전의 모든 항목(첫 번째 항목 포함)을 삭제합니다. tmp는 유지합니다 . 이후의 모든 항목 (포함) 을 삭제합니다.-
{date}T{time}-{suffix}
${tmp%T*}
T